특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶다면 사용한다. 예를 들어, 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하거나, 부모 엔티티를 지우면 자식 엔티티도 지워지는 것을 기대하는 경우를 말한다.
Cascade를 사용하는 경우는 자식 객체를 관리하는 부모 객체가 하나인 경우에는 좋지만, 여러 부모 객체가 한 자식을 관리하는 구조라면 사용해선 안된다.

저장의 예시에는 다음과 가다.
주로 ALL 혹은 PERSIST를 사용한다.
이 CASCADE를 사용한 엔티티 코드 예시이다.
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy="parent", cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<Child>();
// 연관관계 편의 메소드 - 양방향 연관관계 매핑해주기
public void addChild(Child child) {
//이렇게 양쪽 모두에서 매핑해주는 방식이 좋다.
childList.add(child); // '일'쪽에서 '다' 매핑
child.setParent(this); // '다'쪽에서 '일' 매핑
}
@Entity
public class Child {
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn (name = "")
private Parent parent;
}
이러면 em.persist(parent)만 해도 그 parent에 속한 child들이 자동으로 저장된다.
고아 객체는 부모 엔티티와 연관관계가 끊어진, 혹은 부모가 사라진 자식 엔티티를 말한다. 이 고아 객체를 자동으로 삭제하는 방법은 orphanRemoval=true로 설정하는 것이다.
단, 이 방법은 자식 엔티티를 참조하는 곳이 1개의 부모 엔티티였을 때만 사용하는 것이 좋다. 예를 들어, 게시글에서의 댓글이 게시글과 사용자, 두 부모 엔티티에서 참조하고 있는 상황을 생각해보자. 게시글에서도 그 게시글에 달린 댓글들을 확인할 수 있고, 사용자도 사용자가 달았던 댓글들을 확인할 수 있다고 할 때, 게시글에서 댓글을 지운다면, 사용자가 조회하던 댓글 리스트에서는 사라진 댓글을 계속해서 참조하고 있는 상황이 발생한다. 사용자의 댓글 리스트는 객체가 사라졌다는 사실을 자동으로 알아서 업데이트하진 못하기 때문이다.
실제로 댓글은 아직 사용자와의 연관관계는 끊어지지 않았지만, orphanRemoval이 게시글에 걸려있었다면, 게시글과의 관계가 끊어지는 순간 댓글은 고아 객체가 되었다고 판단되어 삭제되는 것이다.
@Entity
public class Parent {
...
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> children = new ArrayList<Child>();
}
이 두 개를 같이 사용하면 부모 엔티티가 자식 엔티티의 생명 주기를 관리할 수 있다. CASCADE로 인해 부모가 저장될 때 자식도 저장되고, 부모가 삭제될 때 자식도 삭제되고, orphanRemoval로 인해 부모 엔티티가 자신의 자식 엔티티 목록에서 자식 엔티티를 삭제한다면 알아서 그 자식 엔티티는 삭제되기 때문에 자식 엔티티의 생명주기는 부모 엔티티에서 관리가 가능해진다.
// 부모만 등록,제거하면 자식은 자동으로 등록,제거된다!
em.persist(parent);
em.remove(parent); // 전체 자식들 제거
parent.getChildList().remove(index:0); // 부모를 통해서 하나의 자식만 제거할 때