【问题标题】:Foreign key constraint issue in JPA despite "cascade all" being present尽管存在“级联所有”,但 JPA 中的外键约束问题
【发布时间】:2017-05-01 15:59:02
【问题描述】:

我正在尝试删除“LearnItem”类型的实体

@Entity
public class LearnItem implements Comparable<LearnItem>, Serializable {

private static final long serialVersionUID = 7526471111622776111L;

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;

@OneToMany(mappedBy="learnItem", cascade = { CascadeType.ALL })
protected List<StudentItemRecord> studentItemRecords;

@OneToMany(mappedBy="learnItem", cascade = { CascadeType.ALL })
protected List<Result> results;
}

但是,我得到一个 “无法删除或更新父行:外键约束失败 (wcdtg7jkp873w8ob.student_item_record, CONSTRAINT FK_ockk47ux0gb08lnuisradomer FOREIGN KEY (learn_item_id) REFERENCES learn_item ( id))" 错误。 在 StudentItemRecord 中,我有 LearnItem 的参考:

@ManyToOne
private LearnItem learnItem;

我不知道为什么会出现这个错误,CascadeType.ALL 设置不是应该删除列表中的所有 StudentItemRecords,避免外键约束问题吗?

【问题讨论】:

  • 您可能正在删除一个没有正确填充学生记录列表的 LearnItem。没有代码,很难说更多。
  • 正确填充是什么意思?
  • 您是在调用 EntityManager.remove(),使用存储库还是查询?

标签: java hibernate jpa one-to-many cascading-deletes


【解决方案1】:

查看您的数据库架构。 JPA 配置不会覆盖您的数据库架构,因此如果您在 JPA 中限制删除,默认情况下不会删除所有依赖项。

或者例如你可能有这样的依赖:

A -> B -> C

A -> B = Cascade
B -> C = Cascade

在这种情况下,如果你删除 A,B 和 C 也会被删除。 如果改为在数据库中,您有

A -> B = Cascade
B -> C = Restrict

什么都不会被删除,因为 B 和 C 之间的 FK 会阻止它。

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 2013-07-16
    • 2019-04-26
    • 2011-02-24
    • 2020-03-16
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多