当前位置: 首页 > 面试题库 >

JPA OneToMany不删除子级

丌官皓君
2023-03-14
问题内容

我对@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;

  ...
}

如果我现在从childs集合中删除and child,它不会从数据库中删除。我尝试取消child.parent引用,但这也不起作用。

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


问题答案:

JPA的行为是正确的( 按照规范的
含义):不能仅仅因为已从OneToMany集合中删除了对象就删除了对象。有特定于供应商的扩展可以执行此操作,但本机JPA不能满足此要求。

在某种程度上,这是因为JPA实际上不知道是否应删除从集合中删除的内容。用对象建模的术语来说,这就是 组合 和“聚合*” 之间的区别。

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

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

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

我知道:

  • 休眠:级联delete_orphan。见10.11。传递持久性 ; 和
  • EclipseLink:将此称为“私有所有权”。请参见如何使用@PrivateOwned批注。


 类似资料:
  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 删除父实体时,我还想删除关联的子实体(从数据库中)。我试图在删除时使用级联,如下所示,但我一定做错了什么。 当对父实体对象调用删除时,我收到错误消息:“该实体仍在数据库的其他地方引用”。我可以确认该实体在数据库的其他地方引用的唯一地方是在下面的两个表中(如果我手动从数据库中删除子行,对父实体对象的删除调用工作正常)。在过去的9个小时里,我一直在阅读实体对象并尝试不同的东西。我做错了什么? 这是我的

  • 我有两个实体使用Spring和Hibernate

  • 删除子串 编写算法,从串s中删除所有和串t相同的子串。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据在第一行中输入不超过80个字符的字符串s,在第二行中输入不超过80个字符的字符串t,s和t中允许包含空格。 输出格式: 对于每组测试,输出在串s中删除所有和串t相同的子串后的结果串。 输入样例: AABBBBCCDDEEBB BB 输出样例: AACCDDEE 代码长度限制 16 KB 时

  • 我的实体。ValidationStep与documentDetail有一对一的关系,documentDetail与documentValidations有一个完全的关系 我的删除查询 父ValidationStep被删除,但是docDetail和documentValidations仍然在数据库中。

  • 注意:如果我只有一个孩子,我可以删除它,没有任何例外,如果我有2个或更多的孩子,我有一个例外。 谢谢你的帮助!