我已经看了很多帖子对这个话题,但一直没能解决这个问题=(
我试图拯救父母和孩子有一个一对多的关系。我相信我下面从其他职位的文档和建议。不过,我遇到的问题是,当Hibernate试图救孩子的记录,它插入为FK“0”到父,而不是真正的ID。
父的hbm.xml映射
<hibernate-mapping>
<class name="ParentClass" table="PARENTTABLE">
<id name="parentid" type="java.lang.Long">
<column name="PARENTID" precision="15" scale="0" />
<generator class="sequence">
<param name="sequence">S_PARENTTABLE</param>
</generator>
</id>
...
<set name="children" table="CHILDTABLE" inverse="true" lazy="true" fetch="select" cascade="all">
<key>
<column name="PARENTID" precision="15" scale="0" not-null="true" />
</key>
<one-to-many class="ParentClass" />
</set>
...
</class>
</hibernate-mapping>
孩子的hbm.xml映射
<hibernate-mapping>
<class name="ChildClass" table="CHILDTABLE">
<composite-id name="id" class="ChildClassId">
....
<key-property name="parentid" type="long">
<column name="PARENTID" precision="15" scale="0" />
</key-property>
</composite-id>
<many-to-one name="parent" class="ParentClass" update="false" insert="false" fetch="select">
<column name="PARENTID" precision="15" scale="0" not-null="true" />
</many-to-one>
....
</class>
</hibernate-mapping>
Java代码保存对象
private myMethod(ParentClass p, HashSet<ChildClass> children){
for(ChildClass child : children){
child.setParent(p);
}
p.setChildren(children); //The parameter type is Set<ChildClass>
sess.save(p);
...
}
因此,将保存正确的ID父对象(下一序列值,即273),但是当它出现,并试图挽救孩子的对象,而不是使用273,它只是使用0。
我想不出如何让休眠救子对象与正确的ParentId(FK)。
任何帮助,您可以提供或任何想法将非常感谢!提前致谢!
**更新**我终于想通了,为什么在子表中的FK没有被插入正确的值。这是由于映射定义。我已经跑在我的DB反向工程师,我查了一个框,说“生成基本类型的复合标识”。这会导致休眠到复合键列作为基本类型的,而不是到实体的引用映射。这在某种程度上混淆,当我做了刀片。
正确的子表映射应该看起来更像是这样的:
更新孩子的hbm.xml映射
<hibernate-mapping>
<class name="ChildClass" table="CHILDTABLE">
<composite-id name="id" class="ChildClassId">
....
<key-many-to-one name="parentid" class="ParentClass" >
<column name="PARENTID" precision="15" scale="0" />
</key-many-to-one>
</composite-id>
</class>
</hibernate-mapping>
注意标签,而不是从之前的标签。另外,外侧的标签消失(或更确切地说移动到ID作为标签)。
我想,在你的情况设置768,16逆属性设置为false在父类中的一个一对多的映射定义。这意味着您的母公司将负责在子表更新FK。在这种情况下hiberntewill保存父实体后更新FK在子表执行额外的更新语句。
<set name="children" inverse="false" lazy="true" fetch="select" cascade="all">
<key>
<column name="PARENTID" precision="15" scale="0" not-null="true" />
</key>
<one-to-many class="ParentClass" />
</set>