Hibernate集合与inverse = true

时间:2015-03-21 13:43:14

标签: hibernate collections inverse

我已将hbm.xml配置为2个集合:两个集合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时,我在C1集合中找到了很多元素但是我的C2集合中的所有项目都不包含每个项目一个元素(每个项目等待2个元素)。

这是一个错误吗?或者我错了吗?

如果可以提供帮助,我可以将您的文件发送给您。

  

Hibernate版本:hibernate-core-4.3.8.Final.jar
   C3P0 :hibernate-c3p0-4.3.8.Final.jar
   JAVA 8.0

提前谢谢。

1 个答案:

答案 0 :(得分:0)

得到了!!!

出现问题的原因是我在C2类&#39; 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)时,他会比较hese 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]的集合。
  • 不要忘记覆盖集合的equals和hashcode。这保证了对象的独特性,并告诉hibernate如何管理它们。
  • 最重要的是:当你写equals和hashcode方法时要小心!不要忘记任何要比较的ID :-)

这就是全部。