2014-09-03 89 views
3

hibernate documentation for dependent collections Understading相關對象的集合的限制,說:在休眠

不能有對對方購買的 雙向關聯查詢參考。組件是值類型,並且 不允許共享引用。一個Purchase可以在一個Order中設置 ,但它不能同時被Item引用。

有人可以幫我理解嗎?

1)爲什麼冬眠限制購買的參考在另一邊?

2)爲什麼它不允許共享引用?

3)這是什麼意思,一個單一的購買不能同時被該項目引用。

有人可以請解釋一些例子。

回答

1

要說明的是,我會與另一個例子開始從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>。然後所有標準的東西將再次工作 - 因爲它將代表參考類型 ...

+0

感謝Radim的詳細解釋。所以我明白,因爲它只是一個類似於價值類型的組件,所以我們無法在Purchase&Order之間進行雙向導航,這是否正確?如果你可以在我的帖子中回答我的第三個問題,這也會非常有幫助。 – Chaitanya 2014-09-03 09:36:42

+1

要回答3):「..'purchase」不能被「Item」引用..「」正是我想說的。購買,被映射爲ValueType''。購買是**不是**引用類型。它不能被引用。即使按項目。物品不能有'List ',因爲沒有普通的''購買。但是,如果我們想要...我們可以 - 通過將轉換爲''。然後我們將定義Id,並將其設置爲Reference Type。所以它甚至可以被Item引用。它有幫助嗎? – 2014-09-03 09:40:57

+0

是完美的,現在它非常清晰 – Chaitanya 2014-09-03 09:42:21