错误:表“tablename”上的更新或删除违反外键约束

新手上路,请多包涵

我正在尝试删除父学生或父课程,但出现此错误:

引起:org.postgresql.util.PSQLException:错误:更新或删除表“学生”违反了表“注册”上的外键约束“fkeyvuofq5vwdylcf78jar3mxol”

RegistrationId 类是注册类中使用的复合键。我正在使用 Spring data jpa 和 spring boot。

我究竟做错了什么?我知道在删除父级时放置 cascadetype.all 也应该删除子级,但它却给了我一个错误。

 @Embeddable
public class RegistrationId implements Serializable {

  @JsonIgnoreProperties("notifications")
  @OneToOne(cascade=CascadeType.ALL)
  @JoinColumn(name = "student_pcn", referencedColumnName="pcn")
  private Student student;

  @JsonIgnoreProperties({"teachers", "states", "reviews"})
  @OneToOne(cascade=CascadeType.ALL)
  @JoinColumn(name = "course_code", referencedColumnName="code")
  private Course course;

注册班

@Entity(name = "Registration")
@Table(name = "registration")
public class Registration {

@EmbeddedId
private RegistrationId id;

原文由 Merv 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 917
2 个回答

我通过使用休眠 @OnDelete 注释使其工作。 JPA.persistence CascadeTypes 无法正常工作的一些原因。它们对我选择的任何一个都没有影响。

就像下面一样。现在我可以删除父学生或父课程,并删除所有子项(注册)。

 @Embeddable
public class RegistrationId implements Serializable {

    @JsonIgnoreProperties("notifications")
    @OnDelete(action = OnDeleteAction.CASCADE)
    @OneToOne
    @JoinColumn(name = "student_pcn", referencedColumnName="pcn")
    private Student student;

    @JsonIgnoreProperties({"teachers", "states", "reviews"})
    @OnDelete(action = OnDeleteAction.CASCADE)
    @OneToOne
    @JoinColumn(name = "course_code", referencedColumnName="code")
    private Course course;

原文由 Merv 发布,翻译遵循 CC BY-SA 3.0 许可协议

当您使用关系数据库时,您正在设置具有这些实体之间关系的实体。

您收到的错误意味着:

您正在尝试删除其主键在另一个表中用作外键的记录, 因此您无法删除它。

为了删除该记录,首先,使用外键删除记录,然后删除要删除的原始记录。

原文由 Moshe Arad 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进