스프링/JPA

cascade = CascadeType.REMOVE ? orphanRemoval = ture?

지팡구 2023. 1. 6. 12:05

목차 

 



들어가기

우리는 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_

 

Deleting JPA Entity Objects

Deleting JPA Entity Objects Existing entity objects can be deleted from the database either explicitly by invoking the removeremove(entity)EntityManager's methodRemove the entity instance.See JavaDoc Reference Page... method or implicitly as a result of a

www.objectdb.com

https://modimodi.tistory.com/22

 

Cascade 이해 및 orphanRemoval=true vs CascadeType.REMOVE

현재 개발하고 있는 프로젝트에서 사용하는 테이블들 간의 관계가 매우 복잡하다. 할 때 마다 까먹고, 정확히 사용하고 있는 건지 확신이 서지 않아 이번 기회에 다시 정리하기로 하였다. 먼저,

modimodi.tistory.com

https://tecoble.techcourse.co.kr/post/2021-08-15-jpa-cascadetype-remove-vs-orphanremoval-true/

 

JPA CascadeType.REMOVE vs orphanRemoval = true

JPA를 공부하다 보면 바로 이해하기 쉽지 않은 개념들을 몇 개 마주친다. 필자는 연관관계 매핑, 영속성 전이, 고아 객체 등이 특히 어려웠다. 이때 와 가 유독 헷갈렸는데, 직접 학습 테스트를 작

tecoble.techcourse.co.kr