在我的应用程序中,我有如下设置:
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答案 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实例...几个小时对通过休眠进行调试最终导致我们正确的猜测。棘手的事情。问题解决了。
对你而言暗示布拉德!