首页 > 解决方案 > 删除 Spring Boot 中的外键约束错误

问题描述

大家好,希望你们一切都好。我正在我的spring boot项目中添加两个实体CategoryItem,它们之间的关系是OneToMany ,即一个Category可以有多个item,许多 item 只能有一个category。根据我的项目要求,当用户删除类别时,其关联项目也将被删除。但是当我尝试删除它说的类别时;

    Cannot delete or update a parent row: a foreign key constraint fails 
(`srms_db`.`issued_item`, CONSTRAINT `FK64cj06b00l58h8yi4msjuljll` FOREIGN KEY (`ii_fk`) REFERENCES `item` (`item_id`))

我正在提供一些代码以进行更多解释;

类别实体代码

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "Category")
public class Category implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cat_id", nullable = false)
    private int catId;

    @Column(name = "cat_type", nullable = false)
    private String catType;

    @Column(name = "cat_desc", nullable = true)
    private String catDesc;

    @OneToMany(mappedBy = "category", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Items> items;

项目实体代码

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
@Table(name = "Item")
public class Items implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "item_id")
    private int itemId;

    @Column(name = "item_name", nullable = false)
    private String itemName;

    @Column(name = "item_quantity", nullable = false)
    private int itemQuantity;

    @Column(name = "item_received_date", nullable = false)
    private Date itemReceivedDate;

    @OneToMany(mappedBy = "item", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<DamageItem> damageItems;

    @OneToMany(mappedBy = "item", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<IssuedItem> issuedItems;

    @ManyToOne
    @JoinColumn(name = "ic_fk")
    private Category category;
}

笔记 I also try on cascade=CascadeType.REMOVE, DETACH, REFRESH, etc but futile

已发行项目实体

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "Issued_Item")
public class IssuedItem implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "issued_id", nullable = false)
    private int IssuedItemId;

    @Column(name = "issued_from", nullable = false)
    private String IssuedFrom;

    @Column(name = "issued_to", nullable = false)
    private String IssuedTo;

    @Column(name = "issued_quantity", nullable = false)
    private int IssuedQuantity;

    @Column(name = "issued_date", nullable = false)
    private Date IssuedDate;

    @ManyToOne
    @JoinColumn(name = "ii_fk")
    private Items item;
}

我还提供了损坏项目实体代码

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "Damage_Item")
public class DamageItem implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "damage_id", nullable = false)
    private int DamageItemId;

    @Column(name = "damage_quantity", nullable = false)
    private int DamageQuantity;

    @Column(name = "damage_date", nullable = false)
    private Date DamageDate;

    @ManyToOne
    @JoinColumn(name = "id_fk")
    private Items item;
}

提前致谢。

标签: javaspring-bootintellij-idea

解决方案


最后,我解决了这个问题,我认为spring boot无法显式设置约束,您必须根据需要手动将OnUpdateOnDelete设置为Cascade或其他东西。

我使用 Sqlyoq 更改设置下面的屏幕截图将清除这个想法

在此处输入图像描述

如您所见,我将OnUpdateOnDelete设置为Cascade。感谢帮助 :)


推荐阅读