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

时间:2017-06-15 20:09:55

标签: postgresql spring-boot spring-data-jpa

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

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

RegistrationId类是注册类中使用的复合键。我正在使用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 个答案:

答案 0 :(得分:6)

我通过使用hibernate @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;

答案 1 :(得分:4)

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

您获得的错误意味着:

您尝试删除其主键在另一个表中作为外键运行的记录,因此您无法将其删除。

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

答案 2 :(得分:1)

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

相关问题