要說明的是,我會與另一個例子開始從DOC:
代碼片段顯示的字符串集合的映射:
<set name="aliases"
table="person_aliases"
sort="natural">
<key column="person"/>
<element column="name" type="string"/>
</set>
在這種情況下, ,我們確實收集了aliases
,表示爲List<string>
,映射爲<element>
。
我們可以清楚地看到,每一個元件在這裏(別名)是string
- 值類型(在相反的對引用類型的意思)。我們也沒有想到,有可能是系統中的任何進一步的地方,引用這個元素...
,因爲它是不一個Refeence型。
現在,讓我們移至:
我們看到的是一個例子,(非常)相似,但不是<element>
,它使用的是<composite-element>
:
<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"/> <!-- class attribute is optional -->
</composite-element>
</set>
雖然對於string
我們在Java中有相關對象(字符串) - 對於上面的構造,我們確實需要自定義類型。這將是一個class Pruchase {}
但即使這是一個自定義類型 - 我們自己的類,在這種情況下它(再次,作爲相對引用類型)表示爲值類型。
爲什麼?因爲它沒有任何id,所以要引用任何鍵。它是從領域建模的角度來構建的。也許這個引用從doc可以幫助更多:
像值類型,組件不支持共享引用。換句話說,兩個人可以具有相同的名稱,但是兩個人物對象將包含兩個獨立的名稱對象,這些名稱對象的值僅爲「相同」。
最後:
這是一個特點。我們可以使用<composite-element>
和<element>
的事實並不意味着我們必須這樣做。我們仍然可以將購買類轉換爲第一級公民,將其映射爲<class>
。然後所有標準的東西將再次工作 - 因爲它將代表參考類型 ...
感謝Radim的詳細解釋。所以我明白,因爲它只是一個類似於價值類型的組件,所以我們無法在Purchase&Order之間進行雙向導航,這是否正確?如果你可以在我的帖子中回答我的第三個問題,這也會非常有幫助。 – Chaitanya 2014-09-03 09:36:42
要回答3):「..'purchase」不能被「Item」引用..「」正是我想說的。購買,被映射爲ValueType''。購買是**不是**引用類型。它不能被引用。即使按項目。物品不能有'List ',因爲沒有普通的''購買。但是,如果我們想要...我們可以 - 通過將轉換爲''。然後我們將定義Id,並將其設置爲Reference Type。所以它甚至可以被Item引用。它有幫助嗎? –
2014-09-03 09:40:57
是完美的,現在它非常清晰 – Chaitanya 2014-09-03 09:42:21