오류
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
댓글