1. ホーム
  2. postgresql

[解決済み] ERROR: テーブル "tablename" の更新または削除は外部キー制約に違反します。

2022-02-27 16:36:30

質問

親学生または親コースを削除しようとしているのですが、このエラーが発生します。

原因:org.postgresql.util.PSQLException: ERROR: テーブル "student" の更新または削除は、テーブル "registration" の外部キー制約 "fkeyvuofq5vwdylcf78jar3mxol" に違反します。

RegistrationIdクラスは、Registrationクラスで使用されるコンポジットキーです。私はSpring data 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;

解決方法は?

hibernateの@OnDeleteアノテーションを使用して動作させました。JPA.persistenceのCascadeTypesはなぜか機能していませんでした。彼らは私が選んだものに対して何の効果もありませんでした。

以下のような感じです。これで、親のStudentや親のCourseを削除すると、すべての子(Registrations)が一緒に削除されるようになりました。

@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;