我已经阅读了许多有关此主题的帖子,但未能解决它=(
我正在尝试保存具有一对多关系的父母及其子女。我相信我正在关注其他帖子的文档和其他建议。但是,我遇到的问题是,当 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 保存父对象(下一个 seq 值,例如 273),但是当它尝试保存子对象时,它不使用 273,而是使用 0。
我不知道如何让 Hibernate 使用正确的 ParentId (FK) 保存子对象。
您可以提供的任何帮助或任何想法将不胜感激!提前致谢!
**更新** 我终于弄清楚为什么子表中的 FK 没有插入正确的值。这是由于映射定义。我在我的数据库上运行了一个逆向工程师,我选中了一个框,上面写着“生成基本类型的复合 ID”。这导致 Hibernate 将复合键列映射为原始类型,而不是对实体的引用。当我做插入时,这有点令人困惑。
正确的子表映射应该更像这样:
更新了子 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中)。