沒有複合元素不能包含集合。但組件可以。讓我試着這樣解釋:
- 第一舉約爲
<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>
映射。
非常感謝您的詳細解釋Radim – Chaitanya 2014-09-03 11:55:36
很好,如果這有幫助,享受休眠;) – 2014-09-03 11:55:59