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

GUR*_*MVG 2 annotations hibernate

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

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

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

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

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

Rob*_*ond 5

使用delete-orphan级联设置.从父项中删除子项后,将删除该子项.

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

就像是

Set<Product> newProducts = new HashSet<Products>();
newProducts.add(prod1);
newProducts.add(prod2);
order.setProducts(newProducts);
Run Code Online (Sandbox Code Playgroud)

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

Set<Product> products = order.getProducts();
products.clear();
products.add(prod1);
products.add(prod2);
Run Code Online (Sandbox Code Playgroud)

应该删除孩子.

并且请记住,对于任何删除孤儿来说,订单和产品必须加载并存在于会话中.