更新父实体时如何删除旧的子记录

时间:2011-02-07 19:00:36

标签: hibernate annotations

我目前正致力于使用注释的双向OneToMany Hibernate关联。 我遇到了问题。

父实体有许多子实体。每当我更新Parent中的Child set并尝试更新Parent实体时,Child表中仍然存在旧的Child条目。所以Parent包含重复的子记录。

每当我更新Parent实体时,它的子条目也应该自动更新,没有重复,这意味着应删除现有的子实体。

我用谷歌搜索,发现有一种肮脏的方式来实现这一目标。获取Parent的现有Child实体并迭代每个子节点并使用session.delete(child)删除每个子实体。我知道这是非常糟糕的方法。

我们能否以更好的方式使用注释来实现上述目标?请帮我解决这个问题。

1 个答案:

答案 0 :(得分:5)

使用delete-orphan级联设置。当孩子从父母身上移除后,孩子将被删除。

您必须修改已加载并存在于会话中的集合,以便删除or-orphan才能工作。这意味着集合必须是PersistentSet或其他任何东西,你删除并添加对象。

这样的东西
Set<Product> newProducts = new HashSet<Products>();
newProducts.add(prod1);
newProducts.add(prod2);
order.setProducts(newProducts);

只会将parent_id int he products表设置为null,它不会删除它们。现在像

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

应删除孩子。

请记住,任何删除孤儿都可以使用,订单和产品必须加载并存在于会话中。