我在我的网络应用程序中使用 JPA over Hibernate。这里有两个实体(只显示了 getter):
class Child {
private Parent parent;
@ManyToOne(optional=false)
@JoinColumn(name="parent_id", referencedColumnName="parent_id", nullable=false, updatable=false)
public Parent getParent() {
return parent;
}
}
class Parent {
private Collection<Child> children;
@OneToMany(fetch=FetchType.EAGER, mappedBy="parent", cascade={CascadeType.ALL})
public Collection<Child> getChildren() {
return children;
}
}
如您所见,Parent
和 Child
关联为“一对多”。
现在我需要加载一个 Parent
实例,删除部分或全部子项并保存更改。以下是对我不起作用的代码:
Parent p = entityManager.find(Parent.class, 12345L); // load entity
p.getChildren().clear(); // remove all children
entityManager.merge(p); // try to save
在上面的示例中没有删除子实体。现在我必须为每个 child 手动调用 entityManager.remove()
。
有没有更简单的方法来管理子集合?
请注意,我不想使用特定于 Hibernate 的功能,只使用纯 JPA。
最佳答案
对于 JPA 2.0,您可以设置 orphanRemoval=true
@OneToMany
对于 JPA 1.0,您应该使用特定于 hibernate 的注解。也就是 @Cascade
注释(而不是 cascade
属性),值为
@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})
Hibernate 3.5+ 实现 JPA 2.0
关于java - 使用 JPA 从集合中删除子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3738934/