JPA OneTomany 不删除子项

2022-08-31 06:41:12

我对父实体和子实体之间的简单映射有问题。一切正常,只是当我从集合中删除子记录时,它们不会被删除。@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 请求的一部分进行。按下保存按钮时,我没有已删除子项的列表,因此我无法隐式删除它们。


答案 1

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

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

组合中,没有父实体,子实体就不存在。一个典型的例子是在房子和房间之间。删除房子,房间也去。

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

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

我知道:


答案 2

除了cletus的答案之外,JPA 2.0,自2010年12月以来的最终版本,在注释中引入了一个属性。有关更多详细信息,请参阅此博客文章orphanRemoval@OneToMany

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


推荐