Hibernate是更新而不是插入,为什么?

问题描述

| 我正在Hibernate开始冒险,所以请耐心等候:) 我想为两个表进行映射,例如A和B。关系beetwen A和B是一对多的。 我写了这个hbm.xml文件
 <hibernate-mapping package=\"something\">
   <class name=\"A\" table=\"A\">
   <id name=\"id\" type=\"int\" column=\"ID\">
      <generator class=\"native\" />
   </id>
   <set name=\"setInA\" sort=\"natural\" cascade=\"all\" lazy=\"false\">
     <key column=\"ANOTHER_ID\"/>
     <one-to-many class=\"B\" />
   </set>
   </class>

  <class name=\"B\" table=\"B\">
   <id name=\"anotherId\" type=\"int\" column=\"ANOTHER_ID\">
      <generator class=\"native\" />
   </id>
   </class>
</hibernate-mapping>
当然,我也制作了POJO类A和B。 现在,当我尝试执行以下操作时:
A a = new A();
Set<B> set = new TreeSet<B>();
set.add(new B());
a.setSetInA(set);
session.save(a);
Hibernate将新行插入表A,但是(最糟糕的情况)不是将新行插入表B,而是仅对B中不存在的行进行sql更新。 可以告诉我为什么会这样吗?我做错了什么?     

解决方法

您应该首先保留B \的对象,或者使用
Cascade
选项。     ,您可以使用Cascade而不使用注释:
<set name=\"setInA\" sort=\"natural\" cascade=\"all\" lazy=\"false\" cascade=\"all\">
     <key column=\"ANOTHER_ID\"/>
     <one-to-many class=\"B\" />
   </set>
这将确保在插入A时插入B实例的集合。     ,在寻找系统中相同症状的原因时发现了这个问题。 Cascade =“ \ all \”没有帮助。 就我而言,我通过向列表元素(在本例中为类B)添加映射来解决此问题。 请注意,封闭类(在此示例中为A)也已版本化。 Hibernate可能要求必须为所有嵌套元素启用版本控制(用于乐观锁定)。我尚未找到任何文档来支持该理论。