使用inverse=true的集合的Hibernate集合



我已经将我的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>

当我完成我父亲的集合C0SETs时,我发现我的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:-)

仅此而已。

最新更新