JPA OneToMany 不删除孩子

新手上路,请多包涵

我有一个简单的问题 @OneToMany 父实体和子实体之间的映射。一切正常,只有当我从集合中删除子记录时不会删除它们。

家长:

 @Entity
public class Parent {
    @Id
    @Column(name = "ID")
    private Long id;

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
    private Set<Child> childs = new HashSet<Child>();

 ...
}

孩子:

 @Entity
public class Child {
    @Id
    @Column(name = "ID")
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="PARENTID", nullable = false)
    private Parent parent;

  ...
}

如果我现在从子集中删除和子,它不会从数据库中删除。我尝试取消 child.parent 参考,但这也不起作用。

实体在 Web 应用程序中使用,删除作为 Ajax 请求的一部分发生。按下保存按钮时,我没有已删除子项的列表,因此我无法隐式删除它们。

原文由 bert 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 959
2 个回答

JPA 的行为是正确的(意思 _是根据规范_):对象不会仅仅因为您已从 OneToMany 集合中删除它们而被删除。有特定于供应商的扩展可以做到这一点,但本机 JPA 不适合它。

部分原因是 JPA 实际上并不知道它是否应该删除从集合中删除的内容。在对象建模方面,这是 组合 和“聚合*”之间的区别。

组合 中,子实体没有父实体就没有存在。一个典型的例子是 House 和 Room 之间。删除房屋,房间也随之消失。

聚合 是一种较松散的关联,以课程和学生为代表。删除课程,学生仍然存在(可能在其他课程中)。

因此,您需要使用特定于供应商的扩展来强制执行此行为(如果可用)或显式删除子项并将其从父项的集合中删除。

我知道:

原文由 cletus 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了 cletus 的回答之外,自 2010 年 12 月起最终版本的 JPA 2.0@OneToMany 注释上引入了 orphanRemoval 属性。有关详细信息,请参阅此 博客条目

请注意,由于该规范相对较新,并非所有 JPA 1 提供程序都有最终的 JPA 2 实现。例如, Hibernate 3.5.0-Beta-2 版本 还不支持这个属性。

原文由 Louis Jacomet 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题