提问者:小点点

错误:更新或删除表"tablename"违反外键约束


我正在尝试删除家长学生或家长课程,我收到以下错误:

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

注册类是注册类中使用的复合键。我正在使用Spring数据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;

共3个答案

匿名用户

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

您收到的错误意味着:

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

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

匿名用户

我通过使用hibernate@OnDelete注释使其工作。JPA.持久性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;

匿名用户

外键保证一个条目将存在于另一个表中。这是一种确保数据完整性的方法。SQL永远不会允许您删除这个条目,而它仍然在另一个表中删除。要么(1)这让您知道删除这个必需的东西会犯一个严重的错误,要么(2)您想进行级联删除,这样不仅这个条目会被删除,其他表中应该引用它的内容也会被删除。关于级联删除的信息可以在这里找到,并且很容易编写(https://www.techonthenet.com/sql_server/foreign_keys/foreign_delete.php)。如果这两种描述都不适合你,首先评估为什么你的外键关系存在,因为它可能不应该存在。