当插入父节点及其子节点时,Hibernate可以在插入子节点时设置父节点而不必在之后更新吗?

时间:2015-04-22 17:47:54

标签: java hibernate

我有两个对象

public class Parent {
    int id;
    String name;
    int Set<Child> children;
}

public class Child {
    int id;
    String name;
    int parentId;
}

使用以下映射文件

<hibernate-mapping>
    <class name="Parent" table="parent">
        <id column="id" access="field">
            <generator class="identity"/>
        </id>    
        <property name="name" column="name" access="field" />    
        <set name="children" access="property" cascade="all" lazy="true"  >
            <key><column name="parent_id"/></key>
            <one-to-many class="com.hp.autonomy.corepolicy.common.dto.LexiconExpression"/>
        </set>
    </class>
    <class name="Child" table="child">
        <id column="id" access="field">
            <generator class="identity"/>
        </id>    
        <property name="name" column="name" access="field" />            
        <property name="parentId" column="parent_id" access="field" not-null="true" />
    </class>
</hibernate-mapping>

当我用一个孩子保存父母时,生成的sql看起来像

  

Hibernate:插入父(id,name)值(null,?)

     

Hibernate:插入child(id,parent_id,name)值(null,?,?)

     

Hibernate:更新子集parent_id =?其中id =?

似乎当hibernate插入子进程时,它将parent_id设置为null,然后在之后更新它。这会导致我的数据库和hibernate验证出现问题,因为架构说parent_id不能为null。

是否可以让第二个insert语句使用插入父项时创建的parent_id,而不是稍后出现并更新子项?

1 个答案:

答案 0 :(得分:1)

您需要更改

<property name="parentId" column="parent_id" access="field" not-null="true" />

通过

<many-to-one name="parent" class="change to the parent classname">
     <column name="parent_id" not-null="true" access="field"/>
</many-to-one>

您需要将Child类更改为parent成员而不是parentId,并相应地更新上面的配置。