【问题标题】:Hibernate soft delete sets foreign key to nullHibernate 软删除将外键设置为 null
【发布时间】:2017-10-20 13:12:34
【问题描述】:

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

删除操作:

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

【问题讨论】:

  • 父级正在被删除,它应该是这样吗?寻找级联删除。
  • 删除标志已设置,这正是我想要的。但是hibernate也破坏了父子关系,通过将child_table中的外键设置为null
  • 在将删除操作从父级级联到私有子级时破坏父子关系是合乎逻辑的,Hibernate 不知道(或关心)来自@SQLDelete 的查询做了什么。出于这个原因,我强烈怀疑你的要求是不可能的。
  • “如您所见,它是一个单向的@OneToOne 映射”。好吧,我看不到代码建议@OneToMany
  • @alan 已编辑..谢谢

标签: java hibernate jpa


【解决方案1】:

我不确定您想要的是否可行,但您可以尝试将其添加到您的映射中:

@OnDelete(action = OnDeleteAction.NO_ACTION)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你需要:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-22
        • 2020-12-02
        • 1970-01-01
        • 2017-03-14
        • 2012-03-30
        • 1970-01-01
        • 2021-03-20
        相关资源
        最近更新 更多