我有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)
参考:
pad*_*dis 14
谢谢你们的答案.你的答案非常相似,但有一些细微的差别.
只是想确保我理解正确:
通常情况下,您不必做类似的事情。
如果集合已正确映射,您应该调用 items.remove(itemToRemove) 即可。
当您关闭 EntityManager(这会触发向数据库写入更改)时,它应该自动识别该项目已从所有者中删除(孤立),并将其从数据库中删除。至少 Hibernate 是这样工作的,并且可以将 DELETE_ORPHAN 指定为集合映射上的级联。
| 归档时间: |
|
| 查看次数: |
28677 次 |
| 最近记录: |