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

时间:2011-05-25 10:17:38

标签: java sql 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 Update。 可以告诉我为什么会发生这种情况吗?我做错了什么?

3 个答案:

答案 0 :(得分:3)

您应首先保留B的对象,或使用Cascade选项。

答案 1 :(得分:0)

您可以在不使用注释的情况下使用Cascade:

<set name="setInA" sort="natural" cascade="all" lazy="false" cascade="all">
     <key column="ANOTHER_ID"/>
     <one-to-many class="B" />
   </set>

这将确保在插入A时插入B实例的集合。

答案 2 :(得分:0)

在我的系统中搜索相同症状的原因时发现此问题。级联=&#34;所有&#34;没有帮助。

在我的情况下,我通过添加映射到list元素来解决这个问题,在本例B中。

请注意,封闭类(本例中的A)也是版本化的。 Hibernate可能要求必须为所有嵌套元素启用版本控制(用于乐观锁定)。我还没有找到任何支持这一理论的文件。