Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jpa正在从列表中删除项_Java_Jpa - Fatal编程技术网

Java jpa正在从列表中删除项

Java jpa正在从列表中删除项,java,jpa,Java,Jpa,我有1-N关系(对象有一个列表),希望从列表中删除一项。使用JPA删除列表中项目的正确方法是什么 我是否必须首先更新列表并合并所有者,然后删除该项(如果我不删除该项而只是合并所有者,则孤立项将保留在DB中,对吗)?在调用merge()和remove()的顺序中,remove()和merge()的顺序重要吗 代码示例: List<Item> items = owner.getItems(); Item itemToRemove = items.get(index); owner.rem

我有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);
List items=owner.getItems();
Item itemToRemove=items.get(索引);
所有者。删除(项目删除);
em.merge(所有者);
em.remove(项目删除);

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

如果集合已正确映射,则应调用items.remove(itemToRemove),仅此而已

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

这就足够了:

List<Item> items = owner.getItems();
Item itemToRemove = items.get(index);
items.remove(itemToRemove);
参考资料:

  • ()
    [不幸的是,没有明确写出来的段落,你必须读一点字里行间的内容]

如果您有
orphanRemoving=true
(JPA 2.0),则此功能应能正常工作


对于JPA1来说,没有标准的方法来处理这个问题。Hibernate有
@Cascade
,您可以在其中指定
DELETE\u ORPHAN

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

只是想确保我理解正确:

  • 在JPA1.0中(通常),我必须对引用的实体调用remove()。实体管理器刷新时不会删除它们。否则孤儿将留在数据库中
  • 在带有Hibernate实现的JPA 1.0中,删除孤立集时,引用的实体将通过实体管理器的刷新被删除。无需调用remove()
  • 在JPA2.0中(一般情况下),当orphanRemoving=true时,引用的实体将通过实体管理器的刷新被删除。无需调用remove()。如果未设置删除,则必须调用remove()以删除引用的实体

  • 是的,你的结论是正确的,我只是在JPA2.0下测试。除此之外,您还可以执行owner.getItems().remove(index)@OJVM重新阅读了我的帖子,从“实际上,一个较短的(和等效的)版本是这样的:@SeanPatrickFloyd如果列表包含100万个条目怎么办?那不是很慢吗?@Ced是的,当然。但JPA的任何方法都可能会因为数据量太大而变得很慢
    List<Item> items = owner.getItems();
    // no need to keep a reference to the object that has to be removed
    items.remove(index);