특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 영속성 전이 기능을 사용하면 된다.
즉, 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다.
💡 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다.
private static void saveNoCascade (EntityManager em) {
Parent parent = new Parent();
em.persist(parent); // 부모 엔티티를 영속화
Child child1 = new Child();
child1.setParent(parent); // 자식 -> 부모
parent.getChildren().add(child1); // 부모 -> 자식
em.persist(child1); // 자식 엔티티를 영속화
Child child2 = new Child();
child2.setParent(parent);
parent.getChildren().add(child2);
em.persist(child2);
}
위의 예제를 보면 부모 엔티티, 자식 엔티티를 각각 영속 상태로 만들었다.
영속성 전이를 사용한다면, 부모만 영속 상태로 만들면 자식도 영속 상태로 만들 수 있다.
cascade = CascadeType.PERSIST 옵션을 설정함으로써 영속성 전이를 활성화할 수 있다.
다음은 이를 적용한 예제이다.
@Entity
public class Parent {
...
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) // 부모를 영속화할 때, 연관된 자식들도 영속화
private List<child> children = new ArrayList<Child>();
...
}
private static void saveWithCascade(EntityManager em){
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
child1.setParent(parent); // 자식1 -> 부모
child2.setParent(parent); // 자식2 -> 부모
parent.getChildren().add(child1); // 부모 -> 자식1
parent.getChildren().add(child2); // 부모 -> 자식2
em.persist(parent); // 부모 저장, 연관된 자식들 저장
}
cascade = CascadeType.REMOVE 옵션을 설정함으로써 엔티티를 삭제할 때도 영속성 전이를 활성화할 수 있다.
즉, 부모 엔티티만 삭제하면 연관된 자식 엔티티도 함께 삭제된다.
💡이 옵션을 설정하지 않는다면❓부모 엔티티만 삭제된다.
DB의 부모 행을 삭제하는 순간 자식 테이블의 외래키 제약조건에 의해 DB에서 외래키 무결성 예외가 발생한다.
💡PERSIST, REMOVE는 em.persist(), em.remove()를 실행할 때 바로 전이가 발생하지 않고, 플러시를 호출할 때 전이가 발생한다.