6

cascade delete-orphan を使用して別のエンティティを削除する際に問題が発生しています。関連するセット コレクションをクリアすると機能しますが、セット コレクションを null にすると機能しません。詳しく説明しましょう。構成スニペット:

<class name="com.sample.CategoriesDefault" table="cats">
  <id name="id" column="id" type="string" length="40" access="property">
     <generator class="assigned" />
  </id>
  <version name="version" column="objVrs"  unsaved-value="negative"/>

 <set name="bla" lazy="false" cascade="all-delete-orphan" inverse="true">
      <key column="idCats" not-null="true"/>
       <one-to-many class="com.sample.BLA"/>
 </set>

<class name="com.sample.BLA" table="blaTEST">
   <id name="id" column="id" type="string" length="40" access="property">
     <generator class="assigned" />
   </id>
   <version name="version" column="objVrs"  unsaved-value="negative"/>
   <property name="bla" type="string" column="bla"/>
   <many-to-one name="parent" class="com.sample.CategoriesDefault" column="idCats" not-null="true"/>
</class>

私のサンプルコード:

Categories cats = new CategoriesDefault();
final Set<BLA> col = new HashSet<BLA>();
col.add(new BLA(cats));
cats.setBla(col);
cats.saveOrupdate(); // will update/insert it in the db.

以下は正しく機能します。つまり、すべてのコレクション項目がデータベースからすべて移動されます。

cats.getBla().clear();
cats.saveOrUpdate();

このメソッドを呼び出すと、Hibernate の PersistSet がダーティとしてマークされるため、これは機能すると思います。

ただし、以下は、私が望む/期待するように、上記と同じようには機能しません。

cats.setBla(null);
cats.saveOrUpdate();

データベースから猫アイテムをリロードすると、まだ BLA アイテムが含まれており、Hibernate によって削除ステートメントが生成されません :(.. なぜでしょうか??... またはこれはバグですか? 私は 3.6.0.Final を使用しています。

4

2 に答える 2

2

休止状態が独自のコレクション実装を使用しているためだと思います (これが、コレクションを実装ではなくインターフェイスとして宣言する必要があるとドキュメントに記載されている理由です)、コレクション実装は推移的な永続化設定のセマンティクスに従うためです。だから、あなたがするとき

cats.getBla().clear()

getBla() 部分は hibernate コレクションの実装であり、clear() が呼び出されたときにセッションから子を削除することを認識しています。

あなたがするとき

cats.setBla(null);

コレクションを削除していないため、コレクションへの親の参照を null に変更しています。コレクションはおそらくまだセッションに存在しています。

于 2011-01-22T20:27:04.670 に答える