Cascade, OrphanRemoval 정리
1. Cascade 란?
특정 엔티티를 영속상태로 만들 때, 연관된 엔티티도 함께 영속상태로 만들고 싶은 경우 Cascade 옵션을 통해 영속성 전이를 설정하고 관리할 수 있다.
1.1. CascadeType.PERSIST
PERSIST는 부모와 자식엔티티를 한 번에 영속화할 수 있다.
CascadeType.PERSIST로 설정하고 부모인 Team을 영속화했을 경우, members에 담긴 Member까지 함께 영속화가 된다.
즉, 부모가 자식의 전체 생명 주기를 관리하게 된다.
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "team", cascade = CascadeType.PERSIST)
private List<Member> members = new ArrayList<>();
}
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private Team team;
}
1.2. CascadeType.REMOVE
위에서 저장된 부모(Team)와 자식(Member)의 엔티티를 모두 제거할 경우에 CascadeType.REMOVE를 사용한다.
만약 부모 객체를 삭제할 경우 삭제할 부모의 자식 객체를 하나씩 삭제해 주는 코드도 작성해야 하지만 CascadeType.REMOVE를 사용하면 부모객체만 삭제해도 자식객체가 함께 삭제된다.
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "team", cascade = CascadeType.REMOVE)
private List<Member> members = new ArrayList<>();
}
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private Team team;
}
1.3. CascadeType.ALL
위의 CascadeType.PERSIST와 CascadeType.REMOVE 기능을 모두 제공한다.
2.1. CascadeType.REMOVE와 orphanRemoval=true의 차이
부모(Team) 객체가 사라질 경우 자식(Member) 객체가 함께 사라지는 것은 동일하나 부모 객체에서 자식 객체를 제거할 때 차이가 난다.
CascadeType.REMOVE은 부모 객체에서 자식 객체와의 관계를 제거해도 자식 객체는 제거되지 않고 그대로 남아있다.
그러나 orphanRemoval=true는 부모 객체에서 자식 객체와의 관계를 제거하면 관계가 제거된 자식 객체를 고아로 취급하고 해당 자식을 삭제한다.