我正在尝试删除父级列表而不删除子级
父母:
@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的简单解决方案?
答案 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
没有Parent
(nullable = false
)。
您需要
在删除父项之前将父ID设置为'代理'Parent
。您可以通过批量更新或通过获取即将删除的父项来迭代,重复子项并重置父引用。是否使用批量更新或对象操作取决于您如何删除父项。如果您使用批量查询删除父级,也请对子级使用批量查询。一般来说,我会使用对象方法作为更安全的方法。批量查询更紧凑。
删除可为空性约束并更改提供的级联。从REMOVE
映射中删除@OneToMany
级联,您可以根据需要删除父级。