我有两个对象
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,而不是稍后出现并更新子项?
答案 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
,并相应地更新上面的配置。