我对@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引用,但这也不起作用。
child.parent
实体在 Web 应用程序中使用,删除作为 Ajax 请求的一部分发生。按下保存按钮时,我没有已删除子项的列表,因此我无法隐式删除它们。
JPA 的行为是正确的(意思 是根据规范 ):对象不会仅仅因为您已从 OneToMany 集合中删除它们而被删除。有特定于供应商的扩展可以做到这一点,但本机 JPA 不适合它。
部分原因是 JPA 实际上并不知道它是否应该删除从集合中删除的内容。 在对象建模方面,这是组合 和“聚合*”之间的区别。
在 组合 中,子实体没有父实体就没有存在。一个典型的例子是 House 和 Room 之间。删除房屋,房间也随之消失。
聚合 是一种较松散的关联,以课程和学生为代表。删除课程,学生仍然存在(可能在其他课程中)。
因此,您需要使用特定于供应商的扩展来强制执行此行为(如果可用)或显式删除子项并将其从父项的集合中删除。
我知道: