首页 > 解决方案 > 无法删除或更新外键约束失败的父行

问题描述

无法删除或更新父行:外键约束失败(gopick. orders_paid_items, CONSTRAINT FKeeefhbl6j5xhs7nnt5mn530f8FOREIGN KEY ( paid_items_product_id, paid_items_user_id) REFERENCES cart( product_id, user_id))

下面的购物车实体

    @Entity
    @ToString
    @EqualsAndHashCode
    @IdClass(CartIdPk.class)
    public class Cart implements Serializable {

    @Column(unique = true)
    private Long id = Long.parseLong(String.format("%06d", new Random().nextInt(999999)));

    @JsonIgnore
    @Id
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    private CartStatus cartStatus = CartStatus.IN_CART;

    @Id
    private int productId;

    private int quantity = 0;

    @Column(length = 10, nullable = true)
    private String discount;

    @Column(length = 30, nullable = true)
    private String paymentRef;

    @JsonIgnore
    @Column(insertable = false, updatable = true)
    @UpdateTimestamp
    private Timestamp lastModified;

    @CreationTimestamp
    private Timestamp dateCreated;

}

Id 类对象 CartIdPk

@NoArgsConstructor
@AllArgsConstructor
@lombok.Data
public class CartIdPk implements Serializable {

    private Long user;

    private int productId;
}

下单实体

    @lombok.Data
    @Entity
    public class Orders implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    @OneToMany(fetch = FetchType.LAZY)
    private Collection<Cart> paidItems;

    @JsonIgnore
    @Column(insertable = false, updatable = true)
    @UpdateTimestamp
    private Timestamp lastModified;

    @CreationTimestamp
    private Timestamp dateCreated;

}

当我尝试从购物车实体表中删除时,如果productId生成的实体表中不存在它,它会完美运行,orders_paid_items但如果存在,它会引发如上所述的错误。

使用默认CrudRepository删除方法从购物车表中删除项目,如下所示

 cartDataService.remove(cartDataService.find(cartId));

标签: jpaspring-data-jpa

解决方案


在 java 中使用 JPA 和 ORM 时的经验法则是记住您同时拥有一个对象模型和一个关系数据库模型,并且您必须在两者中进行更改。

所以你在订单和购物车之间有一对多。

因此,为了争论,您尝试删除当前处于订单中的购物车。当保存发生时,您将违反完整性,因为您尝试删除的购物车仍被订单引用。

您需要做的是在删除之前从卡中删除订单,因为您在订单中引用了购物车。

始终尝试在“对象”级别和数据库级别进行更改。


推荐阅读