使用 JPA 从集合中删除子项

2022-09-01 20:49:01

我在我的Web应用程序中使用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;
  }
}

正如你所看到和联系的那样,“一对多”。ParentChild

现在我需要加载一个实例,删除部分或全部子项并保存更改。以下是对我不起作用的代码:Parent

Parent p = entityManager.find(Parent.class, 12345L); // load entity
p.getChildren().clear(); // remove all children
entityManager.merge(p); // try to save

在上面的示例中,不会删除子实体。现在我必须为每个孩子手动打电话。entityManager.remove()

有没有更简单的方法来管理子集合?

请注意,我不想使用特定于Hibernate的功能,只想使用纯JPA。


答案 1

对于 JPA 2.0,您可以将 orphanRemoval=true 设置为@OneToMany

对于 JPA 1.0,应使用特定于休眠的注释。这是注释(而不是属性),其值为@Cascadecascade

@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})

休眠 3.5+ 实现 JPA 2.0


答案 2

推荐