티스토리 뷰
[Querydsl][오류] Cannot delete or update a parent row: a foreign key constraint fails
foodev 2022. 7. 8. 18:52Cannot 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를 함께 사용하면, 부모가 자식의 전체 생명 주기를 관리한다.
혹시 더 좋은 방법이 있다면 댓글로 피드백 부탁드리겠습니다! 감사합니다.
'💻 개발 > JPA, Querydsl' 카테고리의 다른 글
[JPA] 양방향 연관관계 주인 @ManyToOne / @OneToMany / MappedBy 선언위치 (0) | 2022.07.11 |
---|---|
[JPA] @Entity란? / @Entity주의사항 / 리플랙션 (0) | 2022.07.10 |
[JPA] 영속성 컨텍스트 | JPA 내부에서 어떻게 동작하는가? (0) | 2022.07.09 |
[JPA] JPA를 사용하는 이유 및 객체와 SQL 중심의 개발 문제점 (0) | 2022.07.03 |
[설정] 인텔리제이 queryDsl 인식하지 못하는 오류 (0) | 2022.06.16 |
- Total
- Today
- Yesterday