0

エンティティを削除しようとしていますが、エンティティ マネージャーを使用するとエラーは発生しませんが、データはデータベースに残っています。カスケードをすべて使用していますが、これとは別に、親参照を削除しています。

Parent parent = child.getParent();
parent.getChildren().remove(child);
entityManager.remove(child);
entityManager.merge(parent);

これを行う方法を知っている人はいますか?

4

2 に答える 2

0

これにはいくつかの理由が考えられます。

子から親参照を削除していません -親はおそらく子テーブル内に格納されているchild.setParent(null); ため、これは重要です。id

を呼び出しているときは、削除はまだコミットされていませんmerge。これは問題ではありませんが、最初のアイデアが役に立たない場合は、削除とマージを別のトランザクションに入れてみます。

CascadeType.ALL親でのみ使用していると思います。

于 2013-04-26T07:37:06.460 に答える
0

クリスのコメントに従って編集してください。実際にはまったく明確ではありませんでした。

まず、エンティティ インスタンスが多くの状態を持つことができることを理解する必要があります。http://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/jpa_overview_em_lifecycle.html

Merge は、エンティティを現在の entityManager にアタッチするためにここにあります。管理されると、エンティティに対して行うすべての変更は、EntityManager がフラッシュされたときにデータベースに保持されます。これは通常、現在のトランザクションの最後に発生します (または手動でフラッシュを呼び出したとき、または entityManager が必要であると推定したとき)。

エンティティが現在のトランザクション内の DB から取得された場合、それらは既に管理されているため、merge を呼び出す必要はありません。

これを仮定すると

あなたはただ電話する必要があります

entityManager.remove(child);

または

parent.getChildren().remove(child);

リレーションシップ (親) で孤立した削除を構成した場合。

これは、メソッド呼び出し時ではなく、現在のトランザクションがフラッシュされるときにデータベースに自動的にフラッシュされます。

それ以外の場合は、を使用してフラッシュを強制できますがentityManager.flush()、それは悪い習慣です。とにかく、トランザクションがコミット/クローズされるまで、データベースの変更は表示されません。

を使用して子を削除する場合は、親インスタンスが現在管理されている場合 (取得したか、メモリ内に親のインスタンスが実際に存在することを意味します)、entityManager.remove(child)関連付けられた変更を親エンティティに適用する必要があります ( を使用しておよび を使用parent.getChildren().remove(child)しないでください)。 entityManager.refresh(parent)child.getParent() を呼び出した、または子を取得したときに熱心に読み込まれたためです。)

于 2013-04-26T09:36:21.350 に答える