hibernate documentation for dependent collections说:
另一方面无法提及购买 双向关联导航。组件是值类型和 不允许共享引用。单个购买可以在一组中 订单,但项目不能同时引用。
有人可以帮我理解这个吗?
1)为什么hibernate限制另一方的购买参考?
2)为什么它不允许共享引用?
3)项目同时不能引用单次购买是什么意思。
有人可以用一些例子解释一下。
答案 0 :(得分: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,任何键 - 都要引用。它是从Domain建模的角度构建的。也许这个引用doc可以提供更多帮助:
与值类型一样,组件不支持共享引用。换句话说,两个人可以具有相同的名称,但是两个人对象将包含两个独立的名称对象,这些名称对象仅按值“相同”。
最后:
这是一项功能。我们可以使用<composite-element>
和<element>
这一事实并不意味着我们必须这样做。我们仍然可以将 Purchase 类转换为一级公民,方法是将其映射为<class>
。然后所有标准的东西都会再次起作用 - 因为它代表参考类型 ......