목차
들어가기
우리는 JPA에서 양방향 매핑시 cascade 전략을 이용해 부모가 자식 객체의 생명 주기를 관리할 수 있다. 이 때 전제 조건은 양방향관계를 맺고 있다에서 출발되는데, 양방향 전략 사용 시 둘 중 하나를 하나로 외래 키를 관리해야 한다.
문득 궁금했다. 이 Cascade 전략에 관련해서, 그러다 지식을 습득하는 과정에서 orphanRemoval이라는 키워드도 얻게 되었는데, 이 둘의 차이점이 무엇인지 정리함으로써 내 것으로 만들기 위해 이렇게 글을 정리하는 시간을 갖게 되었다.
JPA CascadeType.REMOVE
이 CasCaseType.Remove를 지정했을 때, 부모 엔티티가 삭제되면 자식 엔티티도 삭제한다. 이 말은 부모가 자식의 생명 주기를 관리한다는 것이다.
orphanRemoval = ture
이 역시도 부모 엔티티가 삭제되면 자식 엔티티도 삭제된다는 것인데, 이는 고아 객체를 제거한다.
부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제를 해주는 이 기능을 고아 객체 제거라고 하는데, orphanRemoval을 이용해 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 자식 엔티티는 고아 객체가 되서 자동으로 삭제된다.
마무리
먼저 cascade.remove와 orphanRemoval = true는 부모 엔티티를 삭제하면 자식 엔티티도 삭제한다는 점에서 같다
이때, 부모 엔티티에서 자식 엔티티를 제거하면 cascade.remove의 자식 엔티티는 그대로 남아있지만, orphanRemoval = true의 자식 엔티티는 제거된다
이 두 케이스는 모두 자식 엔티티에 딱 하나의 부모 엔티티가 연결되어 있는 경우에만 사용해야 한다.
참고 :
https://www.objectdb.com/java/jpa/persistence/delete#Orphan_Removal_
https://modimodi.tistory.com/22
https://tecoble.techcourse.co.kr/post/2021-08-15-jpa-cascadetype-remove-vs-orphanremoval-true/
'스프링 > JPA' 카테고리의 다른 글
@Transactional 복습 그리고 더 나아가기 (readOnly) (0) | 2023.03.11 |
---|---|
count 그리고 성능과 서브쿼리(SubQuery) (1) | 2023.02.15 |
만약 대량의 데이터를 지워야 할 일이 있다면??? (JPA) (0) | 2023.01.14 |
JPA - 영속성 컨텍스트 (2022.12.11 추가) (0) | 2022.12.09 |
What is JPA(Java Persistence API)? (0) | 2022.12.09 |