1

我有两个实体父母和孩子。父母只能有一个孩子。当我保存父母时,我得到一个 CONSTRAINT VIOLATION 异常。

那么,为什么 Hibernate 在保存父实体之前不保存子实体呢?

用于保存父级的 Java 代码:

Child c = new Child();
c.setId(1);

Parent p = new Parent();
p.setId(4);
p.setChild(c);

父 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>
4

1 回答 1

4

要正确回答您的问题,您确实需要至少提供 Child.hbm.xml 文件。如果没有这些附加信息,这个答案充其量只是一个猜测。. .

您的 Child.hbm.xml 文件的 id 是否具有与 Parent.hbm.xml 相同的休眠配置 - 未保存的值为“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),因此它不会尝试插入它。

希望这可以帮助。

莎拉

于 2013-09-10T03:00:46.013 回答