我有1-N关系(对象有一个列表),并希望从列表中删除一个项目。使用JPA删除列表中项目的正确方法是什么?
我是否必须首先更新列表并合并所有者并删除项目后(如果我不删除项目并且只是合并所有者,孤立将保留在DB中,对吧?)?在调用merge()和remove()的顺序中,remove()和merge()的顺序是否重要?
代码示例:
List<Item> items = owner.getItems();
Item itemToRemove = items.get(index);
owner.remove(itemToRemove);
em.merge(owner);
em.remove(itemToRemove);
答案 0 :(得分:18)
这应该适用于orphanRemoval=true
(JPA 2.0)。
对于JPA 1,没有标准的方法来处理这个问题。 Hibernate有@Cascade
,您可以在其中指定DELETE_ORPHAN
答案 1 :(得分:15)
这就足够了:
List<Item> items = owner.getItems();
Item itemToRemove = items.get(index);
items.remove(itemToRemove);
刷新EntityManager
后,owner
和itemToRemove
之间的链接将被删除。如果cascade
设置为CascadeType.ALL
,则itemToRemove也将被删除。
实际上,更短(和等效)的版本是这样的:
List<Item> items = owner.getItems();
// no need to keep a reference to the object that has to be removed
items.remove(index);
<强>参考:强>
答案 2 :(得分:14)
谢谢你们的回答。你的答案非常相似,但有一些细微的差别。
只是想确保我理解正确:
答案 3 :(得分:2)
通常情况下,您不必做任何类似的事情。
如果集合已正确映射,则应调用items.remove(itemToRemove),这就是全部。
当您关闭EntityManager(这会触发向数据库写入更改)时,它应自动识别该项已从所有者中删除(孤立)并从数据库中删除它。至少Hibernate以这种方式工作,并且可以将DELETE_ORPHAN指定为集合映射的级联。