2011-02-07 109 views
2

我目前正在使用註釋處理雙向OneToMany休眠關聯。 我遇到了一個問題。如何在更新父實體時刪除舊的子記錄

父實體有許多子實體。每當我更新Parent中設置的Child並嘗試更新Parent實體時,Child表中仍存在舊的Child條目。所以Parent包含重複的子記錄。

每當我更新父實體時,它的子條目也應該被正確更新而沒有重複,這意味着已經存在的子實體應該被刪除。

我使用Google搜索,發現有一個骯髒的方法來實現這一點。獲取父的現有子實體並遍歷每個子代並使用session.delete(child)刪除每個子實體。我知道這是非常糟糕的做法。

我們能否以更好的方式使用註釋來實現上述目的?請幫我解決這個問題。

回答

5

使用delete-orphan級聯設置。當一個孩子從父母中被移除時,孩子將被刪除。

您將不得不修改會話中已加載和存在的集合,以便刪除孤立工作。這意味着集合必須是一個PersistentSet或其他任何東西,並且您可以刪除並添加對象。

喜歡的東西

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

將只設置PARENT_ID詮釋他的產品表爲空,也不會刪除它們。現在有點像

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

應該刪除孩子。

還記得任何刪除孤兒工作的訂單和產品必須加載並存在會話中。

+0

感謝池塘的答覆。我正在尋找的是,每當家長的孩子集更新並保存父母時,應自動刪除舊的孩子。無論如何,我們可以做到這一點?,而不是遍歷每一個老年兒童,並明確地將其刪除。 – 2011-02-09 09:07:54