Postgresql 错误:更新或删除表“上的”;tablename";违反外键约束
我试图删除家长学生或家长课程,但出现以下错误: 原因:org.postgresql.util.PSQLException:错误:表“student”上的更新或删除违反了表“registration”上的外键约束“fkeyvuofq5vwdylcf78jar3mxol” RegistrationId类是注册类中使用的复合密钥。我使用的是SpringDataJPA和SpringBoot 我做错了什么?我知道当父项被删除时,puting cascadetype.all也应该删除子项,但它给了我一个错误Postgresql 错误:更新或删除表“上的”;tablename";违反外键约束,postgresql,spring-boot,spring-data-jpa,Postgresql,Spring Boot,Spring Data Jpa,我试图删除家长学生或家长课程,但出现以下错误: 原因:org.postgresql.util.PSQLException:错误:表“student”上的更新或删除违反了表“registration”上的外键约束“fkeyvuofq5vwdylcf78jar3mxol” RegistrationId类是注册类中使用的复合密钥。我使用的是SpringDataJPA和SpringBoot 我做错了什么?我知道当父项被删除时,puting 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;
外键保证一个条目将存在于另一个表中。这是确保数据完整性的一种方法。SQL将永远不允许您删除此条目,而它仍在删除另一个表中的条目。要么(1)这让您知道删除此必需项会犯严重错误,要么(2)您希望进行级联删除,这样不仅会删除此条目,而且应该在另一个表中引用它的内容也会被删除。有关级联删除的信息可以在这里找到,并且编写起来相当容易()。如果这两种描述都不适合您,请首先评估外键关系存在的原因,因为它可能不应该存在。当您使用关系数据库时,您正在使用这些实体之间的关系设置实体 您收到的错误意味着: 您正试图删除一条记录,该记录的主键在另一个表中用作外键,因此无法删除该记录。
要删除该记录,首先用外键删除该记录,然后删除要删除的原始记录。我使用hibernate@OnDelete注释使其工作。有些人认为JPA.persistence类型不起作用。他们对我选择的任何一个都没有影响 就像下面一样。现在,我可以删除家长学生或家长课程,并删除所有孩子(注册)
@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;
谢谢你的回答。基本上,我想要的是在添加新注册时确保数据的完整性(学生和课程必须存在),这就是我使用这些外键的原因。但也通过放置cascadetype.all,当我删除父对象时,应该将所有的子对象都带上。这就是我想要的。谢谢你的回答。是的,你是对的。我可以那样做。但这似乎是一个解决办法。因为通过放置注释cascade=cascadeType.all,当父对象被删除时,不应该删除子对象吗?这基本上就是我想要它做的。删除此父项位于其他表中的所有子项。这不是一种解决方法,这只是您的错误的意思。与cascade.all相关,是的,它假定删除关系中的另一个实体,spring data确实尝试删除,但是,由于另一个外键,它无法这样做。为了实现您想要的,只需先删除持有外键的实体。