jpa从列表中删除项目

pad*_*dis 24 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);
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 19

这应该适用于你有orphanRemoval=true(JPA 2.0).

对于JPA 1,没有标准的方法来处理这个问题.Hibernate有@Cascade你可以指定的地方DELETE_ORPHAN


Sea*_*oyd 16

这就足够了:

List<Item> items = owner.getItems();
Item itemToRemove = items.get(index);
items.remove(itemToRemove);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

参考:

  • 这个你可以做owner.getItems().remove(index); (2认同)

pad*_*dis 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()以删除引用的实体.


sol*_*ola 3

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

如果集合已正确映射,您应该调用 items.remove(itemToRemove) 即可。

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