我已经将我的hbm.xml
配置为内部有两个集合:一个集合的集合,其中inverse=true
用于这两个集合。
<class class="C0">
<properties/>
<set inverse="true">
<one-to-many class="C1"/>
</set>
</class>
<class class="C1">
<properties/>
<set inverse="true" >
<one-to-many class="C2"/>
</set>
</class>
<class class="C2">
...
<!-- No collection there -->
</class>
当我完成我父亲的集合C0
到SET
s时,我发现我的C1
集合中有很多元素,但不是所有项目都在C2
集合中,因为每个项目只包含一个元素(每个项目等待2个元素)。
是虫子吗?还是我错了?
如果有帮助的话,我可以把我的文件发给你。
Hibernate版本:Hibernate-core-4.3.8.Final.jar
C3P0:休眠-C3P0-4.3.8.最终.jar
JAVA 8.0
提前谢谢。
明白了!!!
问题的出现是因为我在类C2'ID上的equals方法忘记了一个属性。
举例说明。
我要比较的对象有这样的组合id:id1(类C0),id2(类C1),id3(类C2)。
我的C2类ID的equals方法是这样的
id1.equals(other.id1) && id2.equals(other.id2)
因此,当hibernate访问数据库C2对象(id1,id2,id3)时,他比较这些id,并说obj1.id等于obj2.id,这是真的,这两个对象是相同的。因此hibernate只选择两个对象中的一个。这就是为什么我有一个对象。
解决方案:我在对象C2的类ID的equals方法中添加了缺少的id3,一切都很好。
id1.equals(other.id1) && id2.equals(other.id2) && id3.equals(other.id3)
汇总:
- 使用hibernate,您可以根据需要使用inverse=true来创建collection of collection
- 不要忘记覆盖集合的equals和hashcode。这保证了对象的唯一性,并告诉hibernate如何管理它们
- 最重要的是:在编写equals和hashcode方法时要小心!不要忘记要比较的任何ID:-)
仅此而已。