14

上記のエラー「org.hibernate.ObjectDeletedException: 削除されたオブジェクトがカスケードによって再保存されます (関連から削除されたオブジェクトを削除します):」が表示されます。何が問題で、何が修正されるべきか誰かが私を助けることができますか?

ありがとう。

4

4 に答える 4

21

終了コードをマッピングしないと少し難しいです...これは通常、コレクションに関連付けられているオブジェクトを削除するために発生します。
所有しているコレクションからオブジェクトを削除し、その後オブジェクトを削除する必要があります

parentObject.collection.remove(objToDelete);
session.delete(objToDelete);
session.save(parentObject);

ただし、この方法でマップされたコレクションに deleteOrphan を使用してこれを回避できます

class ParentObject {
  @OneToMany(orphanRemoval=true)
  private List<ChildObject> collection;
}

コードは次のようになります

parentObject.collection.remove(objToDelete);
session.save(parentObject);

parentObject を保存するときに Hibernate によって自動的に削除されるため、オブジェクトを削除する必要はもうありません。

希望は助けになる

于 2013-08-21T13:22:10.610 に答える
6

セッションでエンティティ (A) を削除しましたが、別のエンティティによって参照されており、カスケード アノテーションが付けられています。その参照により、エンティティ (A) がすぐに再作成されます。これはおそらく意図したものではないため、hibernate は文句を言います。

解決策は、エンティティに到達できるすべての参照 (コレクションを含む) を見つけてnull、コレクションからエンティティを /remove に設定することです。

削除ロジックを好転させることができます。参照 (1 つしかない場合) を削除オーファンにし、@bellabax の説明に従って削除します。

于 2013-08-21T13:46:59.700 に答える
3

この例外は、削除しているオブジェクトがエンティティのコレクションにもマップされていること、およびそのコレクション内のカスケードがすべてであることを示しています。したがって、任意の方法で削除したい場合は、カスケードを次のように変更できます

cascade = CascadeType.DETACH
于 2014-06-01T15:28:27.603 に答える
1

これを XML 経由で (注釈ではなく) 実行している場合、以下は私にとって有効な解決策です。

一対多の関連付け:

  1. 親オブジェクトのコレクションから子オブジェクトのリンクをすべて削除します [注: 1 対 1 の関連付けを行う場合は、親オブジェクトの子オブジェクト参照を「null」に設定するだけです]
  2. データベースから子オブジェクトを削除します
  3. session.flush() を使用して変更をフラッシュします
  4. 親オブジェクトを新しい子オブジェクトにリンクする
  5. 親オブジェクトを保存します 6) 変更をコミットします

注意: Hibernate が変更を確認する必要があるため、session.flush() は重要です。

セッションをフラッシュできない場合は、別のトランザクションで手順 (1、2) を実行してから、新しいトランザクションで手順 (4、5、6) を実行することをお勧めします。

于 2016-09-11T10:16:16.767 に答える