jpa从列表中删除项目

时间:2011-01-04 11:48:18

标签: java jpa

我有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);

4 个答案:

答案 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后,owneritemToRemove之间的链接将被删除。如果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)

谢谢你们的回答。你的答案非常相似,但有一些细微的差别。

只是想确保我理解正确:

  1. 在JPA 1.0(一般情况下)中,我必须在引用的实体上调用remove()。它们不会被刷新实体管理器删除。否则孤儿将留在DB中。
  2. 在DELETE_ORPHAN设置时,在带有Hibernate实现的JPA 1.0中,使用flush实体管理器删除引用的实体。无需调用remove()。
  3. 在JPA 2.0(通常)中,当orphanRemoval = true时,使用flush实体管理器删除引用的实体。无需调用remove()。如果未设置orphanRemoval,则必须调用remove()以删除引用的实体。

答案 3 :(得分:2)

通常情况下,您不必做任何类似的事情。

如果集合已正确映射,则应调用items.remove(itemToRemove),这就是全部。

当您关闭EntityManager(这会触发向数据库写入更改)时,它应自动识别该项已从所有者中删除(孤立)并从数据库中删除它。至少Hibernate以这种方式工作,并且可以将DELETE_ORPHAN指定为集合映射的级联。