2017-10-20 114 views
0

我有2个实体是这样的:Hibernate的软删除套外键为空

@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,这就是我想要的。
但是,当我执行删除时,child_table中的parent_id设置为null。为什么会发生这种情况,我该如何解决这个问题?

删除操作:

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

父被删除,它的方式,它应该是没有?寻找级联删除。 –

+0

设置删除标志,这正是我想要的。但是,通过将'child_table'中的外键设置为'null',hibernate也会破坏父 - 子关系。 – Neeraj

+0

将父操作从父级级联到私有子级时,破坏父子关系只是合乎逻辑的,Hibernate不知道(或关心)来自“@ SQLDelete”的查询。出于这个原因,我强烈怀疑你所问的是不可能的。 – crizzis

回答

0

我不知道,如果你想什么是可能的,但你可以尝试添加该给你的映射:

@OnDelete(action = OnDeleteAction.NO_ACTION) 
这个休眠赢得

也许”改变关系。

0

作为一种变通方法,您可以关闭级联删除和手动删除儿童