Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 错误:更新或删除表“上的”;tablename";违反外键约束_Postgresql_Spring Boot_Spring Data Jpa - Fatal编程技术网

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

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也应该删除子项,但它给了我一个错误

我试图删除家长学生或家长课程,但出现以下错误:

原因: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确实尝试删除,但是,由于另一个外键,它无法这样做。为了实现您想要的,只需先删除持有外键的实体。