依赖集合的hibernate文档说:
双向关联导航无法在另一侧参考购买。组件是值类型,并且不允许共享引用。单个购买可以在订单集中,但不能同时被商品引用。
有人可以帮我理解这一点吗?
1)为什么hibernate会限制另一方的购买参考?
2)为什么不允许共享引用?
3)物料不能同时引用一次购买是什么意思?
有人可以用一些例子解释一下。
为了解释这一点,我将从文档中的另一个示例开始:
代码段显示了字符串集合的映射:
<set name="aliases" table="person_aliases" sort="natural"> <key column="person"/> <element column="name" type="string"/> </set>
在这种情况下,我们确实有一个集合 aliases ,用a表示List<string>,并映射为<element>。
aliases
List<string>
<element>
我们可以清楚地看到,这里的每个元素 (别名) 都是string-值类型 (与Reference类型相反) 。我们也没有想到,有可能是系统中的任何进一步的地方, 引用 这个元素...... 因为它 不是 一个 Refeence类型 。
string
现在,让我们转到:
我们看到的是一个 (非常) 相似的示例,但不是<element>使用,而是使用了<composite-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 {}
class Pruchase {}
但是,即使这是一个自定义类型(我们自己的类),在这种情况下,它仍表示为值类型 (同样,与引用类型相反) 。
为什么?因为它没有任何ID,所以要引用任何密钥。它是从Domain建模的角度构造的。也许该文档中的引用可以提供更多帮助:
像值类型一样,组件不支持共享引用。换句话说,两个人可能具有相同的名称,但是两个人对象将包含两个独立的名称对象,它们的值仅“相同”。
最后:
这是一个功能。我们可以使用<composite-element>和的事实<element>并不意味着我们必须这样做。通过将其映射为,我们仍然可以将 Purchase 类转换为第一级公民<class>。然后所有标准的东西将再次起作用-因为它将代表 引用类型 …
<class>