Hibernate软删除将外键设置为null

时间:2017-10-20 13:12:35

标签: java hibernate jpa

我有2个这样的实体:

@SQLDelete(sql = "UPDATE parent_table SET deleted = true WHERE id = ?")
public class Parent {
 private boolean deleted;

 @OneToMany(cascade = CascadeType.ALL)
 @JoinColumn(name = "parent_id")
 private List<Child> children;

// other stuff
}

@SQLDelete(sql = "UPDATE child_table SET deleted = true WHERE id = ?")
public class Child {
 private boolean deleted;
 // stuff
}

如您所见,它是一个单向的@OneToMany映射,两个实体都使用带有@SQLDelete注释的软删除。 我试图软删除父母,然后又想要将孩子软删除。

当我尝试软删除时,它会在两个表中将deleted标志设置为true,这就是我想要的。
但是,执行删除时,parent_id中的child_table设置为null。为什么会发生这种情况?如何阻止这种情况?

删除操作:

Parent parent= entityManager.find(Parent.class, id);
entityManager.remove(parent);

3 个答案:

答案 0 :(得分:0)

我不确定您的想法是否可行,但您可以尝试将其添加到您的地图中:

@OnDelete(action = OnDeleteAction.NO_ACTION)

也许这个Hibernate不会改变这种关系。

答案 1 :(得分:0)

作为一种解决方法,您可以关闭级联删除并手动删除子项

答案 2 :(得分:0)

您需要:

  1. @OneToMany(cascade = CascadeType.ALL)替换为@OneToMany(cascade = CascadeType.PERSIST)
  2. nullable = false注释中添加@JoinColumn(name = "parent_id")