1

親と子の 2 つのエンティティがあります。親は子を 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>

child-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 と同じ休止状態の構成になっていますか? unsaved-value は「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 が null でないため)、挿入しようとしません。

お役に立てれば。

サラ

于 2013-09-10T03:00:46.013 に答える