删除父实体而不删除子项(jpa)

时间:2014-01-07 20:03:51

标签: java hibernate jpa

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

父母:

@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的简单解决方案?

2 个答案:

答案 0 :(得分: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)。这将使得当您删除父项时,也不会删除子项。

答案 1 :(得分:0)

映射不允许简单删除父母与子女。它不支持Child没有Parentnullable = false)。

您需要

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

  • 删除可为空性约束并更改提供的级联。从REMOVE映射中删除@OneToMany级联,您可以根据需要删除父级。