2013-08-27 71 views
24

我無法看到的許多一對一的關係Vs的OneToOne關係的模式有什麼區別:Hibernate的多對一​​VS OneToOne

@Entity 
public class Order { 

    @ManyToOne 
    @JoinColumn(nullable = false) 
    private Address address; 

VS

@Entity 
public class Order { 

    @OneToOne 
    @JoinColumn(nullable = false) 
    private Address address; 

有什麼區別?

回答

28

它們在模式上看起來完全一樣,但在Hibernate層上有所不同。

如果你嘗試類似的東西:

Address address = new Address(); 
Order order1 = new Order(); 
order1.setAddress(address); 
Order order2 = new Order(); 
order2.setAddress(address); 
save(); 

一切都會好的。但是,保存後如果您嘗試獲得訂單:

@OneToOne case: 
org.hibernate.HibernateException: More than one row with the given identifier was found: 1 

@ManyToOne case: 
SUCCESS 

當然,您的地址類在兩種情況下應該看起來不同。

+0

所以我應該罰款在兩個映射之間切換? –

+1

「兩個映射之間切換」是什麼意思?如果您有現有的數據庫模式,並決定在應用程序中更改映射註釋,則可以在不更改模式(從@OneToOne到@ManyToOne)的情況下執行此操作。換句話說,你也可以這樣做,但是你可能會遇到數據問題。 – paulek

+1

對於任何人在未來閱讀paulek的帖子:你的實體必須是_just so_才能得到那個錯誤。如果只有單向關係,那麼該錯誤不會彈出。如果您有雙向關係,則只有選中地址的聯合會獲取訂單纔會生成該錯誤。 –

5

對於OneToOne關聯,通常在address_id連接列上應該有一個唯一的約束,以保證只有一個Order可以有給定的地址。

+0

看起來並非如此 –

+0

至少在MySQL中,它創建索引爲「Unique」類型的外鍵。 – borjab

0

這表明通過擁有相同的主鍵可以更好地服務於雙方的關係。它是這樣的,因爲在@OneToOne關係的情況下,雙方都關聯一個且僅有一個訂單。