0

在我的应用程序中,我有如下设置:

class A {
    String id;
    List<C> list;
}

class B {
    String id;
    List<C> list;
}

class C {
    String id;
}

它在休眠中映射,例如

<class name="A" lazy="false">
    <id name="id">
        <generator class="org.hibernate.id.UUIDGenerator"/>
    </id>
    <list name="list" lazy="false" mutable="false">
        <key column="listA_id"/>
        <list-index column="listA_index"/>
        <many-to-many class="C"/>
    </list>
</class>

<class name="B" lazy="false">
    <id name="id">
        <generator class="org.hibernate.id.UUIDGenerator"/>
    </id>
    <list name="list" lazy="false" mutable="false">
        <key column="listB_id"/>
        <list-index column="listB_index"/>
        <many-to-many class="C"/>
    </list>
</class>

<class name="C" lazy="false">
    <id name="id">
        <generator class="org.hibernate.id.UUIDGenerator"/>
    </id>
</class>

所有 5 个表(每个类一个,多对多关系 2 个)按预期创建。当我执行如下代码时出现问题:

A a = new A();
B b = new B();
C c1 = new C();
C c2 = new C();
C c3 = new C();

<hibernatesession>.save(c1);
<hibernatesession>.save(c2);
<hibernatesession>.save(c3);

a.list.add(c1);
a.list.add(c2);

<hibernatesession>.save(a);

b.list.add(c1);
b.list.add(c3);

<hibernatesession>.save(b);

我在 HSQL 日志文件中跟踪生成的 SQL,发现一切都很好,直到最后一次保存。保存 b 将导致 a 和 c1 之间的关联从 many-many-tabel A_list 中删除。从数据库中重新获取对象 a 和 b 将导致 c1 和 c3 在 b.list 中,但只有 c2 在 a.list 中。

观察: * 游戏中没有级联。* 切换保存 a/b 的顺序将导致 c1 从先保存的列表中删除。* 两个列表都映射到索引。* 两个列表都使用不同的键/索引列名称进行映射。* hibernate 完全删除列表共有的那些元素

有人可以向我解释这种休眠行为并知道如何正确实现相应的映射吗?

提前谢谢!!!猪蹄草

4

2 回答 2

0

修复了错误。经验教训:如果您在 hibernate 中的某些集合之间有奇怪的相关性,请首先检查您是否不小心为它们使用了相同的 Java 实例...几个小时 pairDebugging 到 hibernate 终于让我们做出了正确的猜测。棘手的事情。问题解决了。

谢谢你暗示布拉德!

于 2012-05-04T16:52:08.340 回答
0

尝试向 C 类添加多对多映射,使其成为双向关系。也许通过明确“父”关系,它会知道保留多个关系,而不是像您解释的那样删除第一个关系。

<class name="C" lazy="false">
    <id name="id">
        <generator class="org.hibernate.id.UUIDGenerator"/>
    </id>
    <list name="listA" lazy="false" mutable="false" inverse="true">
        <key column="listC_id"/>
        <many-to-many class="A"/>
    </list>
    <list name="listB" lazy="false" mutable="false" inverse="true">
        <key column="listC_id"/>
        <many-to-many class="B"/>
    </list>
</class>
于 2012-05-03T15:56:45.773 回答