【问题标题】:JPA : Cannot delete or update a parent rowJPA:无法删除或更新父行
【发布时间】:2016-10-11 09:20:25
【问题描述】:

我正在尝试从表中删除子条目,并且我的实体具有 2 向关系。我遇到异常“无法删除或更新父行:外键约束失败”。 当我删除与父项自动删除的子项关系时,我需要映射。

@Entity
@Table
public class RuleModel implements Comparable<RuleModel>    {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Rule_Id", unique = true, nullable = false)
    protected Integer id;

    @OneToOne(fetch = FetchType.EAGER)
    protected RuleModel parent;

    @OneToOne(fetch = FetchType.EAGER)
    protected RuleModel child;
}

【问题讨论】:

  • 你需要设置级联drop:stackoverflow.com/questions/306144/…
  • 但我不想删除我的父条目。
  • 对于您的情况,parentchild 可能都引用同一个对象。请检查您的代码。
  • 或者可能是子或父引用之一,我不太确定你的模型是如何工作的,它看起来很奇怪。
  • 问题解决了吗?

标签: java hibernate jpa spring-data


【解决方案1】:

您必须在删除子对象之前打破对象之间的关系。

【讨论】:

    【解决方案2】:

    我在 pre-remove 块中设置了父子 null ,所以休眠首先更新关系为 null 然后删除

    @PreRemove
    public void preRemove() {
    
        if (parent != null) {
            parent.setChild(null);
        }
        if (child != null) {
            child.setParent(null);
        }
    }
    

    【讨论】:

    • 您的设计容易出错。您实际上并不需要像在 DB 中那样单独存储父母和孩子。只需将它们视为相同关系的 2 个方向会更好,这意味着只需将“父级”存储在 DB 中,并将其映射到您的实体中。对于子关系,请使用mappedBy。并且,在您的域逻辑中执行这些操作,而不是依赖 @PreRemove。虽然您现在可以删除该东西,但您的父母现在指向没有孩子,而您的孩子没有父母,这对我来说似乎是一些数据不一致。
    • 我正在构建 2 路链接列表
    • 所以?这实际上更糟。如果从双向链表中删除一个节点,它的 prev 的 next 应该指向 node 的 next 并且它的 next 的 prev 应该指向 node 的 prev。您所做的只是破坏列表。而且,我在上一篇评论中所说的与你想要做的没有矛盾。在 DB 中,您只需要存储父 ID,在实体模型中,您可以像现在所做的那样拥有该关系的两个方向
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2021-09-09
    • 2016-06-30
    相关资源
    最近更新 更多