【问题标题】:Understading the restrictions for collection of dependent objects in hibernate了解hibernate中依赖对象收集的限制
【发布时间】:2014-09-03 05:47:00
【问题描述】:

hibernate documentation for dependent collections 说:

不能参考另一方的购买 双向关联导航。组件是值类型和 不允许共享引用。单个购买可以在集合中 一个订单,但它不能被项目同时引用。

有人可以帮助我理解这一点吗?

1) 为什么hibernate会限制对方的购买参考?

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

3) 单次购买不能被Item同时引用是什么意思?

谁能用一些例子解释一下。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    为了解释这一点,我将从 doc 中的另一个示例开始:

    代码 sn -p 显示字符串集合的映射:

    <set name="aliases"
                table="person_aliases" 
                sort="natural">
        <key column="person"/>
        <element column="name" type="string"/>
    </set>
    

    在这种情况下,我们确实有一个 aliases 集合,表示为 List&lt;string&gt;,映射到 &lt;element&gt;

    我们可以清楚地看到,这里的每个元素(alias)都是一个string - Value Type(与Reference类型的含义相反)。我们也没有想到,系统中可能还有其他位置,引用这个元素...
    因为它不是 参考类型

    现在,让我们转到:

    我们看到的是一个例子,(非常)类似,但不是&lt;element&gt;,而是使用&lt;composite-element&gt;

    <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 中有相关的对象 (string) - 对于上述构造,我们确实需要自定义类型。那就是class Pruchase {}

    但即使这是一个自定义类型——我们自己的类,在这种情况下它也被表示为一个值类型(再次,与引用类型相反)

    为什么?因为它没有任何 id,任何键 - 被引用。它是从领域建模的角度构建的。也许doc 的引用可以提供更多帮助:

    与值类型一样,组件不支持共享引用。换句话说,两个人可以有相同的名字,但是两个人对象将包含两个独立的名字对象,它们的值只是“相同”。

    最后:

    这是一项功能。我们可以使用&lt;composite-element&gt;&lt;element&gt; 的事实并不意味着我们必须。我们仍然可以通过将 Purchase 类映射为&lt;class&gt; 将其转换为一级公民。然后所有标准的东西都会再次起作用——因为它代表了一个引用类型...

    【讨论】:

    • 感谢 Radim 的详细解释。所以我明白,因为它只是一个类似于值类型的组件,我们不能在采购和订单之间进行双向导航,对吗?如果您能在我的帖子中回答我的第三个问题,那将非常有帮助。
    • 回答 3):“..purchase 不能被 Item.. 引用”正是我想说的。购买,映射为 ValueType &lt;composite-element&gt;。购买不是参考类型。它不能被引用。即使按项目。项目不能有List&lt;Purchase&gt;,因为没有常用的&lt;class&gt; 购买。但如果我们想要...我们可以 - 将&lt;composite-element&gt; 转换为&lt;class&gt;。然后我们将定义Id,并将其设为Reference Type。所以它甚至可以被Item引用。有帮助吗?
    • 太棒了 ;) 享受惊人的休眠,先生 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多