理解在hibernate中收集依赖对象的限制

时间:2014-09-03 05:47:01

标签: java hibernate

hibernate documentation for dependent collections说:

  

另一方面无法提及购买   双向关联导航。组件是值类型和   不允许共享引用。单个购买可以在一组中   订单,但项目不能同时引用。

有人可以帮我理解这个吗?

1)为什么hibernate限制另一方的购买参考?

2)为什么它不允许共享引用?

3)项目同时不能引用单次购买是什么意思。

有人可以用一些例子解释一下。

1 个答案:

答案 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>。然后所有标准的东西都会再次起作用 - 因为它代表参考类型 ......