1. 원인
- FK 제약 조건 때문에 게시글을 삭제하면 댓글이 참조하는 게시글이 사라지기 때문에 삭제가 되지 않는 오류 발생
2. 해결 방법
- 댓글을 삭제하고 게시글 삭제하기
- 댓글(자식)의 FK에 값을 NULL로 update하고 게시글 삭제하기
- 어노테이션을 이용해서 (cascade remove) 도움 받기 - 우리가 쓸 것!
3. Cascade
- JPA(Java Persistence API)에서 엔티티 간의 연관 관계를 관리하는 데 사용되는 기능 중 하나
- 한 엔티티의 상태 변화가 다른 연관된 엔티티에도 전파되는 방식을 정의
- CASCADE : 부모 엔티티의 상태 변화가 자식 엔티티에 전파
부모 엔티티가 삭제될 때 연관된 모든 자식 엔티티도 함께 삭제
- ALL : 모든 상태 변화를 포함
부모 엔티티의 모든 상태 변화가 자식 엔티티에 전파됩니다.
- REMOVE : 부모 엔티티가 삭제될 때 해당 부모와 연관된 자식 엔티티도 함께 삭제
- PERSIST : 부모 엔티티가 저장될 때 해당 부모와 연관된 자식 엔티티도 함께 저장
- MERGE : 부모 엔티티가 병합될 때 해당 부모와 연관된 자식 엔티티도 함께 병합
- REFRESH : 부모 엔티티가 새로 고침될 때 해당 부모와 연관된 자식 엔티티도 함께 새로 고침
- DETACH : 부모 엔티티가 분리될 때 해당 부모와 연관된 자식 엔티티도 함께 분리
- ALL-DELETE-ORPHAN : 부모 엔티티의 모든 연관된 자식 엔티티를 삭제하거나 분리
연관된 자식 엔티티가 부모와의 관계를 끊는 경우에 유용
cascade = CascadeType.REMOVE // 게시글이 삭제되면 자식들도 다 삭제
4. 고아 객체(Orphan Removal)
- JPA에서 관계를 맺고 있는 엔티티 중 한 쪽의 엔티티가 다른 한 쪽과의 관계를 끊을 때
해당 엔티티를 삭제할지 여부를 설정하는 기능
- 자식 엔티티가 부모 엔티티와의 관계를 끊을 때 자동으로 삭제되어야 하는지 여부를 결정
- 디폴트가 false
orphanRemoval : 기본이 false
자식 엔티티를 부모 엔티티의 컬렉션에서 제거해도 해당 자식 엔티티는 삭제되지 않음
해당 자식 엔티티는 "고아"가 되어 영속성 컨텍스트 밖에서 사용 가능
orphanRemoval : true
자식 엔티티를 부모 엔티티의 컬렉션에서 제거할 때 자동으로 삭제
영속성 컨텍스트에서 삭제되고 다음 트랜잭션에서 해당 엔티티가 실제로 삭제
5. 게시글 삭제 방법
- 자식 PK를 null 처리한다. -> null 처리하는 방법 : update
- 실무에서 하는 방법 -> FK 걸지 않음
- CASECADE REMOVE 옵션 // 우리가 사용할 것
6. insert 하기
- 게시글에 댓글 컬렉션을 PERSIST를 걸어서 CASECADE 옵션으로 거는 것
Share article