我开始使用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。 可以告诉我为什么会发生这种情况吗?我做错了什么?
答案 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可能要求必须为所有嵌套元素启用版本控制(用于乐观锁定)。我还没有找到任何支持这一理论的文件。