2017-07-18 61 views
1

我在hibernate中執行一對一(一個員工<-> one Mobile)關係,如下所示。這段代碼工作正常,但由於這是一對一的關係,因此將相同的手機號碼分配給emp1和emp2應該產生了問題(它違反了關係),但代碼正在接受並在同一移動設備上添加2個emp(從數據庫表中確認)。爲什麼冬眠一對一的關係就像一個手機< - >很多員工? 我的代碼: @Entity冬眠中的一對一關係

public class Employee { 
    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 
    private String name; 
    @OneToOne 
    private Mobile mobile; 
    //...rest of the code 
} 
@Entity 
public class Mobile { 
    @Id @GeneratedValue 
    private int id; 
    private long number; 
    //...rest of the code 
} 
Test Client main(...){ 
    Mobile mobile = new Mobile(9999999999L); 
    Employee emp1 = new Employee("Raja"); 
    Employee emp2 = new Employee("Raja"); 
    emp1.setMobile(mobile); 
    emp2.setMobile(mobile);// VIOLATING 1-1 RELATIONSHIP 
    //...REST OF THE COMMON CODE 
    session.save(mobile); 
    session.save(emp1); 
    session.save(emp2); 
    session.getTransaction().commit(); 
} 

數據庫顯示,都與同一個移動號碼EMP記錄(1-1違例)

+0

你使用hibernate屬性'hibernate.hbm2ddl.auto'來生成你的表嗎?當hibernate負責創建表時,它會自動添加唯一性約束,否則你必須手動添加它。 –

+0

可能的重複https://stackoverflow.com/questions/8968294/why-onetoone-is-allowing-duplicate-associations –

+0

是的,這與評論鏈接中的問題類似。道歉重複 –

回答

0

一對一的關係,你應該始終確保你有一個獨特的對數據庫的約束(由休眠或手動創建)。

Hibernate不會檢查它,因爲它需要每次收集額外的數據來做檢查。數據庫可以更高效地完成。 要做這個檢查,hibernate將不得不做額外的查詢。如果數據庫配置正確,額外的查詢將花費時間和資源而沒有任何收益。

如果您沒有唯一的約束,並且您定義了雙向關係,則可能會遇到更多麻煩。 Hibernate將保存衝突記錄,而不會像您已經發現的那樣抱怨。對於hibernate來說,使用從另一方的對象開始的關係是不可能的(通過你的情況通過Mobile獲得Employee)。如果將移動設備配置爲熱切地獲得其相關員工,那麼在員工將其保存在哪裏之後,移動設備就不可能在內存中獲得。

+0

感謝Stefan解釋得很好。所以請告訴我,我是否正確地理解了它 - 「它不是一種多/多對一的休眠的責任,它應該是通過模型對象關係,並且它只是一個提供給休眠的輸入,以便它可以採取某些措施授予並優化其實施「。在得到你很好的解釋之前,我也嘗試了下面。 –

+0

對於之前未完成的評論感到抱歉。 - 通過@OneToOne註釋添加了對Mobile端的Employee引用,使其成爲雙向的。導致兩個表都與其他外鍵相關聯。仍然可以通過將emp1,emp2分配給同一個移動設備(儘管它忽略了錯誤的實現hib)來搞亂代碼。 –

+0

將你的對象模型正確映射到數據庫方案是冬眠責任。數據庫中數據的一致性是另一回事。 –