更新包含相同对象的其他列表时,hibernate删除列表关系

时间:2012-05-03 14:22:43

标签: java hibernate hibernate-mapping

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

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

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

class C {
    String id;
}

在hibernate中映射,如

<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之间的关联从多对多表A_list中删除。从数据库中重新获取对象a和b将导致c1和c3在b.list中但在a.list中只有c2。

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

有人可以解释一下hibernate的这种行为,并知道如何正确实现各自的映射吗?

提前thx !!! Salsolatragus

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

修正了错误。经验教训:如果您在休眠中的某些集合之间存在奇怪的相关性,请首先检查您是否意外地为它们使用相同的Java实例...几个小时对通过休眠进行调试最终导致我们正确的猜测。棘手的事情。问题解决了。

对你而言暗示布拉德!