영속성 전이

0taetae·2025년 1월 16일
post-thumbnail

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 영속성 전이 기능을 사용하면 된다.
즉, 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다.

💡 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다.

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에서 외래키 무결성 예외가 발생한다.

✏️CASCADE의 종류

  1. ALL : 모든 영속성 작업
  2. PERSIST(영속) : 저장 작업
  3. MERGE(병합) : 병합 작업
  4. REMOVE(삭제) : 삭제 작업
  5. REFRESH : 새로고침
  6. DETACH : 분리 작업

💡PERSIST, REMOVE는 em.persist(), em.remove()를 실행할 때 바로 전이가 발생하지 않고, 플러시를 호출할 때 전이가 발생한다.

0개의 댓글