2011-02-07 98 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

相关问题