java - 使用 JPA 从集合中删除子项

标签 java hibernate orm jpa one-to-many

我在我的网络应用程序中使用 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

在上面的示例中没有删除子实体。现在我必须为每个 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/

相关文章:

java - 如何在 netbeans 编辑器中获取当前行号

java - 尝试在不同的类中使用@transient变量

java - 如何在 EntityListeners 中注入(inject) EntityManager

java - 即使未定义 `queryResultList`,JPA 也会限制 `setMaxResults`

android - 如何在 Android 中更新 DBFlow?

java - JLabel:重音字母问题

java - 如何在没有项目的情况下降级jar文件的版本?

java - hibernate - 多对多关系中的级联删除

java - 为什么我必须点击提交按钮两次?

java - QueryDSL @OneToOne Join-FetchMode 与 Hibernate