본문 바로가기
트러블슈팅

[Spring JPA data]jpa Cannot delete or update a parent row: a foreign key constraint fails

by pyogowoon 2023. 2. 9.

오류

Cannot delete or update a parent row: a foreign key constraint fails

 

@OneToOne이나 @OneToMany에서 붙여주는 영속성 전이 Cascade 때문에 일어난 문제

 

필드에 cascade = CascadeType.ALL을 붙여주면 그 필드와 연관된 엔티티를 persist 해주지 않아도 persist한 효과가 나면서 영속성이 된다.

 

하지만 Cascade를 사용하면 편리하긴하지만 주의해야할 점이 있다. 두가지 조건을 만족해야 사용할 수 있다.

 

1.등록 삭제 등 라이프 사이클이 똑같을 때

 

2. 단일 엔티티에 완전히 종속적일때만 사용 가능하다.

 

해결방법으로는

 

1 - 연관관계 를 끊거나 (사실상 힘듬)

 

2 - OneToMany(mappedBy = "주인" , orphanRemoval = true )

1:N 관계의 테이블의 OneToMany에 mappedBy를 통해 연관관계의 주인을 정의하고, orphanRemoval = true 를 선언해서

 부모 엔티티 삭제시 자식 엔티티도 삭제 처리한다.

 

 여기서 orphanRemoval 이란

 orphanRemoval = true

자식 엔티티의 변경이 있다면

 

JPA 에서 자식엔티티의 수정은 insert - update - update - delete 의 순서로 진행된다

 

변경된 자식을 먼저 insert 하고

 

기존의 자식을 NULL로 update 한다.

그리고 orphanRemoval 옵션을 true 로 하면 기존 NULL처리된 자식을 DELETE 한다. 

 

PK(JoinColumn)값이 NULL로 변한 자식은 고아객체라고 하여 연결된 점이 없는 객체이다. 

orphanRemoval옵션은 바로 이 고아객체를 삭제해주는 역활을 한다.

(Cascade 는 고아객체를  삭제하지않는다, 둘은 그 차이이다)

 

 

 

출처 https://cantcoding.tistory.com/75

 

JPA delete관련 에러 (Cascade 영속성 전이 관련 에러)

문제점: Review 엔티티에 대해서 테스트 코드를 작성하던중 모두 성공했지만 엔티티 삭제 테스트에서 엔티티를 삭제해도 삭제되지 않는 상황을 마주쳤다. 리뷰 엔티티는 간단하게 다음과 같은 연

cantcoding.tistory.com

 

댓글