부모 엔티티가 영속화될 때 자식 엔티티도 같이 영속화되고, 부모 엔티티가 삭제될 때 자식 엔티티도 삭제되는 등 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 전이되는 것을 의미한다.
JPA에서는 이러한 연관된 엔티티간의 의존성(dependency)을 설정하기 위해 Enum 타입의 javax.persistence.CascadeType 을 제공하고 있다.
CascadeType.ALL
CascadeType.PERSIST
CascadeType.MERGE
CascadeType.REMOVE
CascadeType.DETACH
CascadeType.REFRESH
CasecadeType.Remove
는 부모 엔티티가 삭제되면 자식 엔티티도 삭제된다.
즉, 부모가 자식의 삭제 생명 주기를 관리한다.
만약 CascadeType.REFRESH도 함께 사용하면, 부모가 자식의 전체 생명 주기를 관리하게 된다.
그러나 이 옵션의 경우, 부모 엔티티가 자식 엔티티와의 관계를 제거해도 자식 엔티티는 삭제되지 않고 그대로 남아있다.
orphanRemoval = true
또한 부모 엔티티가 삭제되면 자식 엔티티도 삭제 된다.
그런데 CasecadeType.Remove와는 달리, 부모 엔티티가 자식 엔티티와의 관계를 제거하면 자식은 고아로 취급되어 그대로 사라진다.
두 옵션은 부모 엔티티를 삭제할 때는 동일하게 동작하지만, 부모 엔티티에서 자식 엔티티와의 관계를 제거할 때 차이점을 가진다.
두 케이스 모두 자식 엔티티에 딱 하나의 부모 엔티티가 연관되어 있는 경우에만 사용해야 한다.
예를 들어 Member(자식)을 Team(부모)도 알고 Parent(부모)도 알고 있다면, CascadeType.REMOVE 또는 orphanRemoval = true의 사용을 조심할 필요가 있다.
자식 엔티티를 삭제할 상황이 아닌데도 어느 한쪽의 부모 엔티티를 삭제했거나 부모 엔티티로부터 제거됐다고 자식이 삭제되는 불상사가 일어날 수 있기 때문이다.
그러므로 @OneToMany에서 활용할 때 주의를 기울이고, @ManyToMany에서는 활용을 지양하는 것이 좋다.