首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带顺序FK的Hibernate级联保存父/子

带顺序FK的Hibernate级联保存父/子
EN

Stack Overflow用户
提问于 2012-08-15 05:32:48
回答 1查看 7.2K关注 0票数 1

我已经读了很多关于这个话题的帖子,但都没能解决这个问题。

我正在尝试保存具有一对多关系的父项及其子项。我相信我正在遵循其他帖子中的文档和其他建议。然而,我遇到的问题是,当Hibernate试图保存子记录时,它会将FK的'0‘插入到父记录中,而不是插入真实的id。

父hbm.xml映射

代码语言:javascript
复制
<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映射进行

代码语言:javascript
复制
<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代码

代码语言:javascript
复制
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。

我不知道如何让Hibernate用正确的ParentId (FK)保存子对象。

如果您能提供任何帮助或想法,我们将不胜感激!提前感谢!

** UPDATE **我终于弄明白了为什么子表中的FK没有插入正确的值。这是由于映射定义造成的。我在我的数据库上运行了一个反向工程,我选中了一个框,上面写着‘生成基本的类型化复合ID’。这导致Hibernate将复合键列映射为原语类型,而不是对实体的引用。当我做插入的时候,不知何故把它搞糊涂了。

正确的子表映射应该如下所示:

更新子hbm.xml映射

代码语言:javascript
复制
<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中)。

EN

回答 1

Stack Overflow用户

发布于 2012-08-15 14:09:39

我认为在您的情况下,应该在父类的一对多映射定义中将逆向属性设置为false。这意味着您的父实体将负责更新子表中的FK。在这种情况下,hiberntewill会在保存父实体后执行额外的update语句来更新子表中的FK。

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11961071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档