2

次のセットアップがあります

A -> B -> C

A-マッピング:

 <hibernate-mapping>
  <class name="db.base.A" table="A">
      <id name="id" type="java.lang.Integer">
          <column name="id" />        
          <generator class="identity" />    
      </id>
      <set name="Bs" table="BI18n" inverse="true" lazy="true" fetch="select" cascade="all-delete-orphan">
          <key>
              <column name="A_id"  not-null="true" />
          </key>
          <one-to-many class="db.base.B" />
      </set>        
  </class>
</hibernate-mapping>

B:

<hibernate-mapping>
  <class name="db.base.B" table="B">
      <id name="id" type="java.lang.Integer">
          <column name="id" />
          <generator class="identity" />
      </id>
      <many-to-one name="A" class="db.base.A" fetch="select">
          <column name="A_id" not-null="true" />
      </many-to-one>
      <set name="B" table="B" inverse="true" lazy="true" fetch="select" cascade="all-delete-orphan">
          <key>
              <column name="id" not-null="true" />
          </key>
          <one-to-many class="db.base.BI18n" />
      </set>
  </class>
</hibernate-mapping>

SubstanceItentifiedI18n:

<hibernate-mapping>
  <class name="db.base.BI18n" table="B18n">
      <id name="id" type="java.lang.Integer">
          <column name="id" />
          <generator class="identity" />
      </id>
      <many-to-one name="B" class="db.base.B" fetch="select">
          <column name="id" not-null="true" />
      </many-to-one>          
  </class>
</hibernate-mapping>

完全なオブジェクトグラフを使用して新しい A を挿入すると、

HibernateDaoSupport.merge(AObj);

すべてが正しく作成されます。

しかし、私が使用する場合

HibernateDaoSupport.saveOrUpdate(AObj);

私はDataIntegrityException

Cannot add or update a child row: a foreign key constraint fails 
(`table`.`B18n`, CONSTRAINT `B18n_fk` 
FOREIGN KEY (`id`) REFERENCES `B` (`id`))

log4j ログを見ると、merge

  1. それは挿入しますB
  2. それは挿入しますB18n

saveOrUpdateそれと_

  1. inserts B18n、明らかに例外が発生します

これは定義された(予想される)動作ですか、それとも私の設定に何か問題がありますか。

4

1 に答える 1

1

少しいじった後、解決策が何であるかがわかりました。

既存のに新しい要素を追加していましたB。ただし、me​​rgeは保存/更新を発行する前にオブジェクトグラフのIDを実行するBため、のIDは設定しませんでした。これは問題ありません。SELECT

saveOrUpdate一方、それはしません。したがって、例外です。

名探偵コナン;)

于 2012-01-25T17:40:45.737 に答える