我正在尝试删除家长学生或家长课程,我收到以下错误:
由以下原因引起: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;
当您使用关系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)。如果这两种描述都不适合你,首先评估为什么你的外键关系存在,因为它可能不应该存在。