我有两个实体Parent和Child。父母只能有一个孩子。 当我保存父节点时,我得到了一个CONSTRAINT VIOLATION异常。
那么,为什么Hibernate在保存父实体之前不保存孩子?
用于保存父级的Java代码:
Child c = new Child();
c.setId(1);
Parent p = new Parent();
p.setId(4);
p.setChild(c);
parent-hbm.xml文件:
<hibernate-mapping default-cascade="all">
<class name="com.ParentImpl" table="Parent" dynamic-insert="false" dynamic-update="false">
<cache usage="read-write" />
<id name="id" type="java.lang.Long" unsaved-value="null">
<column name="ID" sql-type="BIGINT"/>
</id>
<many-to-one name="child" class="com.ChildImpl" foreign-key="CHILDFKC" cascade="all" lazy="false" fetch="select">
<column name="CHILD_FK" not-null="true" sql-type="BIGINT" unique="true"/>
</many-to-one>
</class>
</hibernate-mapping>
子-HBM-的.xml
<hibernate-mapping default-cascade="all">
<class name="ChildImpl" table="DATA_DELETION_PERIODS" dynamic-insert="true" dynamic-update="true">
<cache usage="read-write" />
<id name="id" type="java.lang.Long" unsaved-value="null">
<column name="ID" sql-type="BIGINT"/>
</id>
</class>
</hibernate-mapping>
答案 0 :(得分:4)
要正确回答您的问题,您至少需要提供Child.hbm.xml文件。没有这些额外的信息,这个答案充其量只是一个猜测。 。 。
您的Child.hbm.xml文件的id是否与Parent.hbm.xml具有相同的hibernate配置 - 未保存的值为“null”?
<hibernate-mapping default-cascade="all">
<class name="com.ChildImpl" table="Child" dynamic-insert="false" dynamic-update="false">
<id name="id" type="java.lang.Long" unsaved-value="null">
<column name="ID" sql-type="BIGINT"/>
</id>
....
</class>
</hibernate-mapping>
如果是这样,那就是你的问题。在创建父/子的代码中设置子代码的ID告诉Hibernate这个实体已经是持久的(因为它有一个非空的id),所以它不会尝试插入它。
希望这有帮助。
萨拉