2014-09-03 18 views
1

集合作爲每hibernate documentation,它說:複合元件可以包含在休眠

一個組件的屬性可以是任何Hibernate類型 (集合,多對一個關聯,以及其它部件,等等) 。嵌套0​​組件不應被視爲一種奇特的用法。休眠是 旨在支持一個細粒度的對象模型。

有了這個聲明,我明白我可以聲明一個組件,其屬性可以是集合。

現在再次醫生說:

組合元素可以包含組件,但是不能包含集合。如果您的 複合元素包含組件,請使用 標籤。這種情況是 組件本身有組件的集合。如果一對多關聯更合適,您可能需要考慮 。將 複合元素重新編碼爲一個實體,但請注意,即使Java模型相同,關係模型和持久性語義仍爲 ,但略有不同。

所以這裏說的是複合元素可以包含組件,但不包含集合。與上面的陳述相矛盾,有人可以解釋一個組件是否可以收集或不收集。如果可能的話,請提供一個小例子。

回答

1

沒有複合元素不能包含集合。但組件可以。讓我試着這樣解釋:

  • 第一舉約爲<component>元素,而
  • 第二是關於<composite-element>

他們都讓我們映射值類型對象(作爲相反的參考類型) - 如在這裏詳細地討論:

那麼,差異在哪裏呢?爲什麼第一個<component>可以包含集合,而第二個<composite-element>不可以?簡化的答案是:

因爲<composite-element>集合項目的映射了。

另一方面,<component>是一個映射根 - <class>級別。

完整和更好的答案是:

兩種類型做有自己的ID,它們在關係數據庫結構KEY。這就是爲什麼他們被視爲價值類型 - 他們不能被引用。

  • <component>是相對於一對一個以它的根部<class> - 它具有訪問根/類ID。因此它可能會收集<key column="">根ID。
  • <composite-element>不具有訪問它的ID /密鑰(不存在在所有)和不在同一水平<component>。有沒有地方騙,因爲我們有部分做了

所以,雖然我們可以看到這樣

<class name="eg.Person" table="person"> 
    <id ... 
    ... 
    <component name="Name" class="eg.Name" unique="true"> 
     <parent name="namedPerson"/> //reference back to the Person 
     <property name="initial"/> 
     <property name="first"/> 
     <property name="last"/> 

     // here we go 
     // collection mapped inside of the <component> 

     <set name="celebrationDates" table="name_Dates"> 
      <key column="person"/> 
      <element column="name" type="date"/> 
     </set> 
    </component> 
</class> 

隨着<composite-element>,我們最終會得到一個集合項目映射映射:

<class name="eg.Order" .... > 
    .... 
    <set name="purchasedItems" table="purchase_items" lazy="true"> 
     <key column="order_id"> 
     <composite-element class="eg.Purchase"> 
      <property name="purchaseDate"/> 
      <property name="price"/> 
      <property name="quantity"/> 
      <many-to-one name="item" class="eg.Item"/> 

      // this is already component 
      // but without ID to be used 
      // as a reference on the other side of bidirectional relation 

     </composite-element> 
    </set> 
</class> 

總結,這兩種映射都嘗試提供類似的功能。他們有不同的名字,因爲他們在不同的場景中使用。

我們可以想象,即使<composite-element>的集合可以工作,如果我們 ...並停在這裏。如果我們需要,不要使用組件。使用完整的<class>映射。

+0

非常感謝您的詳細解釋Radim – Chaitanya 2014-09-03 11:55:36

+0

很好,如果這有幫助,享受休眠;) – 2014-09-03 11:55:59