🍃이 글은 inflearn에서 김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵을 학습하고 작성한 것입니다.🍃
public class Parent {
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
public void addChild(Child child) {
childList.add(child);
child.setParent(this);
}
}
cascade = CascadeType.ALL
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만든다.
동작 과정
영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다.
위 예시와 반대로 Child에서 영속성 전이를 설정할 수도 있다.
또한 양방향에서뿐만 아니라 단방향에서도 설정할 수도 있다.
하지만 개인적으로 위 예시처럼 사용하는 것이 제일 직관적인 거 같다.
ALL: 모두 적용
PERSIST: 영속
public class Parent {
@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
public void addChild(Child child) {
childList.add(child);
child.setParent(this);
}
}
orphanRemoval = true
고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제한다.
자식 엔티티를 컬렉션에서 제거할 때
부모 자체를 제거할 때
CascadeType.ALL + orphanRemoval=true 이 두 옵션을 적용한다.
부모 엔티티를 통해서 자식의 생명주기(영속화, 제거)를 전부 관리할 수 있다.
도메인 주도 설계(DDD)의 Aggregate Root 개념을 구현할 때 유용하다.
영속성 전이와 고아 객체는 부모가 자식의 생명주기를 관리하는 만큼 주의해야 한다.
즉, 하나의 부모가 자식들을 관리할 때만 사용해야 버그가 생기지 않는다.
자식들이 또 다른 부모, 소유자와 연관이 있을 땐 쓰지 말자.
@OneToOne, @OneToMany에서만 사용 가능하다.