2011-02-07 21 views
2

現在、注釈を使用して双方向のOneToMany Hibernateの関連付けを行っています。 問題が発生しました。親エンティティの更新時に古い子レコードを削除する方法

親エンティティには多くの子エンティティがあります。 Parentで設定されたChildを更新し、Parentエンティティを更新しようとすると、古いChildエントリはまだChildテーブルに存在します。親には重複する子レコードが含まれています。

私は親エンティティを更新するたびに、自動的に子エントリも重複しないように正しく更新する必要があります。つまり、既存の子エンティティを削除する必要があります。

私はグーグルでこれを達成するための汚い方法があることがわかりました。親の既存の子エンティティを取得し、各子を反復処理し、session.delete(子)を使用して各子エンティティを削除します。これは非常に悪いアプローチです、私は知っています。

アノテーションを使用して上記のことをより効果的に達成できますか?これを解決する際に私を助けてください。

答えて

5

delete-orphanカスケード設定を使用してください。子が親から削除されると、その子は削除されます。

delete-orphanを動作させるために、セッションにロードされ、存在するコレクションを変更する必要があります。つまり、コレクションはPersistentSetなどでなければならず、オブジェクトを削除して追加する必要があります。

Set<Product> newProducts = new HashSet<Products>(); 
newProducts.add(prod1); 
newProducts.add(prod2); 
order.setProducts(newProducts); 

よう

何かが唯一nullにPARENT_ID int型彼の製品テーブルを設定しますが、それはそれらを削除しません。今のようなもの

Set<Product> products = order.getProducts(); 
products.clear(); 
products.add(prod1); 
products.add(prod2); 

子供を削除する必要があります。

そして、孤立した孤児が注文を処理し、製品がロードされ、セッションに存在していることを覚えておいてください。

+0

お返事ありがとうございます。私が正確に探しているのは、親の子セットが更新され、親を保存するときに自動的に古い子を削除することです。とにかく私たちはこれを達成することができますか?、すべての古い子供を繰り返して、明示的に削除する代わりに。 –

+0

私の答えを更新しました。 –

+0

ありがとうRobby - これは私が見ている問題だと思います。 Wow - Hibernateは私の見積もりでさらに低下しました - そして、それはあまりにも高く評価されていませんでした!どのようなS#%*の作品! –

関連する問題