반응형
orphanRemoval과 casecade는 @OneToMany
에서 삭제 동작을 제어하는 두 가지 옵션이다. orphanRemoval=true
, CascadeType.REMOVE
두 옵션 모두 부모-자식 관계에서 자식 엔티티를 삭제하는 설정이지만 차이가 있다.
casecade
casecade는 부모 엔티티의 상태 변화가 자식 엔티티에 전파되도록 설정하는 옵션으로 부모 엔티티가 생성/수정/삭제 될 때 자식 엔티티에도 부모 엔티티를 따라 데이터베이스에 생성/수정/삭제되록 설정한다. 이 옵션에 지정할 수 있는 다양한 CascadeType
이 있다.
- PERSIST: 비영속 상태의 부모 엔티티를 영속상태로 변경할 때 자식 엔티티도 영속 상태로 변경
- MERGE: 준영속 상태의 부모 엔티티를 영속상태로 변경할 때 자식 엔티티도 준영속 상태로 변경
- REMOVE: 영속 상태의 부모 엔티티를 삭제 상태로 변경할 때 자식 엔티티까지 삭제 상태로 변경
- REFRESH: 부모 엔티티를 데이터베이스에서 다시 조회할 때 자식 엔티티도 다시 갱신
- DETACH: 영속 상태의 부모 엔티티를 준영속 상태로 변경할 때 자식 엔티티도 준영속 상태로 변경
- ALL: 위 모든 동작 적용
CascadeType.REMOVE
를 지정하면 부모 엔티티가 삭제될 때 연관된 자식 엔티티도 함께 삭제된다.
orphanRemoval
orphanRemoval은 고아 객체를 어떻게 처리할지 설정하는 옵션이다. 고아 객체란 부모 엔티티 객체와 연관 관계가 끊어진 자식 엔티티 객체를 말한다. 이 옵션을 true로 설정하면 연관 관계가 끊어진 자식 객체를 데이터베이스에 동기화할 때 삭제한다.
차이점
부모-자식 연관 관계에서 삭제가 수행되기 때문에 혼동이 왔었다. 부모-자식 관점에서 보니 차이점을 명확히 알 수 있었다.
- cascade는 부모 엔티티의 변경을 자식에게 전파하는 옵션이다. CascadeType.REMOVE을 설정하면 부모 엔티티가 삭제될 때 자식 엔티티도 삭제된다.
- orphanRemoval은 자식 부모와 자식 간의 관계가 끊어질 때 자식 엔티티를 삭제한다.
반응형