Hibernate的级联保存父/子与测序FK

问题描述 投票:1回答:1

我已经看了很多帖子对这个话题,但一直没能解决这个问题=(

我试图拯救父母和孩子有一个一对多的关系。我相信我下面从其他职位的文档和建议。不过,我遇到的问题是,当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作为标签)。

hibernate parent sequence cascade
1个回答
0
投票

我想,在你的情况设置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>
© www.soinside.com 2019 - 2024. All rights reserved.