【问题标题】:Remove parent entity without removing children (jpa)删除父实体而不删除子实体 (jpa)
【发布时间】:2014-01-07 20:03:50
【问题描述】:

我正在尝试删除父级列表而不删除子级

父母:

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

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

 ...
}

孩子:

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

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

  ...
}

我所做的是使用 HQL 查询更新所有孩子,然后也使用 HQL 查询删除父母列表。

问题是这种方式太重了,有没有使用JPA的简单解决方案?

【问题讨论】:

  • 您可以使用 JPA 批量更新来清除列表中引用父级的所有子级,然后使用批量删除来删除列表中的所有父级。这是你在 HQL 中所做的吗?
  • 你能发布你的代码先更新然后删除吗?

标签: java hibernate jpa


【解决方案1】:

您可以在以下部分中将您的 Cascade 设置为不删除

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

通过如下编辑注释:

 @OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "parent")

以及您需要的任何其他 CascadeType 选项(请参阅CascadeType Enums)。这将使得当您删除父母时,孩子也不会被删除。

【讨论】:

    【解决方案2】:

    映射不允许简单地删除父母及其子女。它不支持没有Parent (nullable = false) 的Child

    你要么需要

    • 在删除父母之前将父母 ID 设置为“代理”Parent。您可以通过批量更新或获取即将被删除的父级、迭代子级并重置父级引用来完成此操作。是否使用批量更新或对象操作取决于您将如何删除父项。如果您使用批量查询删除父项,请同时对子项使用批量查询。一般来说,我会使用对象方法作为更安全的方法。批量查询更紧凑。

    • 删除可空性约束并更改提供的级联。从@OneToMany 映射中移除REMOVE 级联,您可以随意移除父级。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2018-12-04
      • 2011-03-25
      • 2018-12-03
      相关资源
      最近更新 更多