김영한 님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'를 듣고 적은 글 입니다.
CASCADE는 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다. @ManyToOne, @OneToMany 등 연관관계를 설정하는 부분에 옵션으로 정의되어 있다.
예를 들어 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하려할 때 CASCADE를 사용할 수 있다.
모든 Cascade를 적용한다.
엔티티를 영속화할 때, 연관된 하위 엔티티도 함께 유지한다.
엔티티 상태를 병합할 때, 연관된 하위 엔티티도 모두 병합한다.
엔티티를 제거할 때, 연관된 하위 엔티티도 모두 제거한다.
영속성 컨텍스트에서 엔티티를 제거한다.
부모 엔티티에서 detach를 수행하면 연관된 하위 엔티티도 detach 상태가 되어 변경사항이 반영되지 않는다.
상위 엔티티를 새로고침할 때, 연관된 하위 엔티티도 모두 새로고침한다.
부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제한다. orphanRemoval = true를 사용하면 된다.
@OneToOne, @OneToMany만 사용가능부모를 제거하면 자식은 고아가 된다. 따라서 고아 객체 제거 기능인 orphanRemoval=true를 사용하면 부모를 제거할 때 자식도 함께 제거된다. 이 로직은 CascadeType.REMOVE처럼 동작한다.
CascadeType.REMOVE는 부모 엔티티가 삭제되면 자식 엔티티도 삭제된다. 즉, 부모가 자식의 삭제 생명 주기를 관리한다. 이때 부모 엔티티가 자식 엔티티와의 관계를 제거해도 자식 엔티티는 삭제되지 않고 그대로 남아있다. orphanRemoval=true는 부모 엔티티가 자식 엔티티와의 관계를 제거하면 자식 엔티티는 고아로 취급되어 그대로 사라진다.
부모 엔티티를 삭제할 때는 동일하게 동작하지만 부모 엔티티에서 자식 엔티티와의 관계를 제거할 때 차이점을 가진다.
두 옵션을 모두 활성화하면 부모 엔티티를 통해 자식의 생명주기를 관리할 수 있다. 이는 도메인 주도 설계(DDD)의 Aggregate Root 개념 구현시에 유용하다