2012-12-05 72 views

回答

8

@OneToOne用於映射兩個與一對一關係相關的數據庫表。例如,客戶可能總是在名稱表中有一條記錄。

或者,如果這些名稱字段的Customer表中(而不是在一個單獨的表),那麼你可能需要一個@Embedded。在它的表面上,您可以將名稱字段作爲標準屬性添加到Customer實體,但如果這些相同的列出現在多個表上(例如,您可能在Supplier表上有名稱列),那麼它可能很有用。

7

它的組成和聚合的區別。 @嵌入式對象總是在其父母的生命週期內進行管理。如果家長被更新或刪除,他們也會被更新或刪除。 @OneToOne對象可能通過其@Join註釋的cascadeType選項模仿合成,但默認情況下它們是聚合的,也就是說它們的生命週期與其父對象的生命週期是分開的。

1

@Embedded通常表示一個複合主密鑰作爲可嵌入的類:

@Entity 
public class Project { 
    @EmbeddedId ProjectId id; 
    : 
} 

@Embeddable 
Class ProjectId { 
    int departmentId; 
    long projectId; 
} 

主鍵字段在一個可嵌入的類中定義。該實體包含一個使用@EmbeddedId進行註釋幷包含該可嵌入類的實例的單個主鍵字段。使用此表單時,未定義單獨的ID類,因爲可嵌入類本身可以表示完整的主鍵值。

@OneToOne是針對與一個一對一的關係相關的映射2 DB表。 @Id將是主鍵。

2

@Embedded使用具有值對象(其具有僅當連接到一物體含義對象),而一對一映射是具有自己存在和意義兩個物體之間。

例如,

Value Object和@Embedded:如果我們有一個User類,並且此類中有一個地址Object,則它可以被視爲一個值對象,因爲除非與用戶關聯,否則地址本身沒有任何意義。這裏地址對象可以用@Embedded註釋。

一對一映射和@OneToOne:如果我們有一個User類,並且此類有一個'父'對象或'母'對象,我們想要將'Father'或'Mother'實例註釋爲@作爲'父親'或'母親'的OneToOne有其自己的含義和存在,並不是Value對象到User類。

密切相關的一個區別是@OneToMany和@ElementCollection之間。兩者都用於保存Java類中Collection類型的實例變量。不同之處在於@ElementCollection被用於當被保存的集合的元素是值對象時,而當元素和對象具有明確定義的含義和存在時使用@OneToMany。