クリスのコメントに従って編集してください。実際にはまったく明確ではありませんでした。
まず、エンティティ インスタンスが多くの状態を持つことができることを理解する必要があります。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() を呼び出した、または子を取得したときに熱心に読み込まれたためです。)