[Querydsl][오류] Cannot delete or update a parent row: a foreign key constraint fails
Cannot delete or update a parent row: a foreign key constraint fails를 검색해보다가
다들 workbench에 강제적으로 삭제하라는 말 밖에 없어서 글을 작성하게 되었습니다.
[에러발생 문구]
1. Cannot delete or update a parent row: a foreign key constraint fails
2. ` FOREIGN KEY (`review_id`) REFERENCES `tb_debate_review` (`review_id`))
3. a foreign key constraint fails (`community`.`tb_review_member`, CONSTRAINT `FKbxh8q7ql121fkgy4cvrq1hecc` FOREIGN KEY (`review_id`) REFERENCES `tb_debate_review` (`review_id`))
1. 오류가 발생한 이유
테이블을 쿼리로 직접 삭제할 때 예외가 걸렸다.
왜냐하면 테이블 삭제 시 관계가 되어있는 두 개 이상의 테이블의 관계가 걸려 있기 때문이다.
테이블을 참조하게 되는 불안정한 이상 상태가 되어 DBMS에서 사전에 방지를 해주는 것인데, (ORMdml cascade 지정 설정으로 삭제가 되기도 함) 이를 무시하고 강제로 삭제를 하려고 할 때 오류 메시지를 보여준다.
member(자식)테이블의 컬럼을 삭제하려고 했을때 외래키의 무결성 제약조건에 위배 되어 발생한 오류이다.
2. 해결 방법
[1. 강제적인 삭제 방법]
1. foreign key 체크 설정을 비활성화하고
2. 테이블을 삭제시킨다.
3. 테이블 삭제 후 다시 foreign key 체크를 활성화하여 안전성을 지켜주면 된다.
[2. 고아객체를 선언하기]
entity객체의 @onToMany에 선언하기
orphanRemoval = true
club과 members가 관계 매핑이 걸려 있어 Cannot delete or update a parent row: a foreign key constraint fails가 발생했다.
@OneToMany(mappedBy = "club", orphanRemoval = true)
@JsonBackReference
private List<ClubMember> members;
주인/종의 관계는
@ManyToOne인 club이 주인이고, @OneToMany인 members가 종이다.
orphanRemoval = true를 종에게 선언해서 부모엔티티가 삭제되면 자식 엔티티도 삭제된다.
따라서 CascadeType.PERSIST를 함께 사용하면, 부모가 자식의 전체 생명 주기를 관리한다.
혹시 더 좋은 방법이 있다면 댓글로 피드백 부탁드리겠습니다! 감사합니다.