2011-01-04 11 views
22

1-N関係(オブジェクトにリストがあります)があり、リストから1つの項目を削除します。 JPAでリスト内のアイテムを削除する正しい方法は何ですか?jpaリストから項目を削除する

リストを更新してアイテムをマージしてからアイテムを削除する必要があります(アイテムを削除せずにオーナーをマージすると、孤児はDBに残っています)。どのシーケンスでmerge()とremove()を呼び出すべきかは、remove()とmerge()の順序が関係しますか?

コードサンプル:

List<Item> items = owner.getItems(); 
Item itemToRemove = items.get(index); 
owner.remove(itemToRemove); 
em.merge(owner); 
em.remove(itemToRemove); 

答えて

2

通常、あなたはそのような何もする必要はありません。

コレクションが正しくマップされている場合は、items.remove(itemToRemove)を呼び出す必要があります。

EntityManagerを閉じると(データベースへの変更が書き出されます)、アイテムが所有者から削除(孤立)されたことが自動的に認識され、データベースから削除されます。少なくともHibernateはこのように動作し、コレクションのマッピングのカスケードとしてDELETE_ORPHANを指定することができます。

15

これで十分です:EntityManagerがフラッシュされると

List<Item> items = owner.getItems(); 
Item itemToRemove = items.get(index); 
items.remove(itemToRemove); 

owneritemToRemove間のリンクが削除されます。 cascadeCascadeType.ALLに設定されている場合、itemToRemoveも削除されます。

実際には、より短い(及び相当)バージョンは、このです:

List<Item> items = owner.getItems(); 
// no need to keep a reference to the object that has to be removed 
items.remove(index); 

リファレンス:

  • Managing EntitiesJava EE 5 tutorial
    [残念ながら、これは書き出されない通路が存在しません明示的には、線の間で少し読む必要があります]
+2

これをInteadで行うことができます。owner.getItems()。remove(index); – OJVM

+0

@OJVMは、 "実際には、より短い(そして同等の)バージョンはこれです:"と書いてあります。 –

+0

@SeanPatrickFloydリストに100万のエントリが含まれているとどうなりますか?それは遅くないでしょうか? – Ced

18

これはorphanRemoval=true(JPA 2.0)を使用している場合に有効です。

JPA 1の場合、これを処理する標準的な方法はありません。 Hibernateにはが指定できます。DELETE_ORPHAN

14

ありがとうございます。あなたの答えは非常に似ていますが、若干の違いがあります。

はちょうど私が右のそれを理解することを確認する:

  1. 私が参照するエンティティのremove()を呼び出す必要があります(一般的に)JPA 1.0で。彼らはエンティティマネージャのフラッシュで削除されません。さもなければ、孤児はDBに残るでしょう。
  2. DELETE_ORPHANが設定されている場合のHibernate実装のJPA 1.0では、参照されたエンティティがエンティティマネージャのフラッシュとともに削除されます。 remove()を呼び出す必要はありません。
  3. orphanRemoval = trueの場合、JPA 2.0(一般的に)では、参照されたエンティティがエンティティマネージャのフラッシュとともに削除されます。 remove()を呼び出す必要はありません。 orphanRemovalが設定されていない場合は、参照されたエンティティを削除するためにremove()を呼び出す必要があります。
+0

はい、あなたの結論は正しいです、私はJPA2.0でテストします。それは大丈夫です – Scarlett

関連する問題