영속성 전이(CASCADE)

Mina Park·2022년 9월 11일
0

1. 기본개념

  • 특정 엔티티를 영속상태로 만들 때 연관된 엔티티도 영속상태로 만드는 것
  • 예) 부모 엔티티 저장시 자식 엔티티도 함께 저장
@Entity
public class Parent {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Child> childList = new ArrayList<>();

    //연관관계 편의 메소드
    public void addChild(Child child) {
        childList.add(child);
        child.setParent(this);
    }
}
@Entity
public class Child {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Parent parent;
}
    		Child child1 = new Child();
            Child child2 = new Child();
            Parent parent = new Parent();
            parent.addChild(child1);
            parent.addChild(child2);

            //각각 persist하지 않아도 parent cascade를 all로 설정하면 연관된 child도 영속상태가 됨
            em.persist(parent);
//            em.persist(child1);
//            em.persist(child2);

            tx.commit();
Hibernate: 
    /* insert hellojpa.cascade.Parent
        */ insert 
        into
            Parent
            (name, id) 
        values
            (?, ?)
Hibernate: 
    /* insert hellojpa.cascade.Child
        */ insert 
        into
            Child
            (name, PARENT_ID, id) 
        values
            (?, ?, ?)
Hibernate: 
    /* insert hellojpa.cascade.Child
        */ insert 
        into
            Child
            (name, PARENT_ID, id) 
        values
            (?, ?, ?)

📌영속성 전이는 연관관계 맵핑과는 전혀 관련이 없음

  • 엔티티를 영속화할 때 연관된 엔티티도 같이 영속화하는 편리함을 제공할 뿐

2. cascade의 종류
실무에서는 ALL, PERSIST 정도만 실제 많이 활용함

  • ALL: 모두 적용 => 라이프사이클을 전부 맞추고 싶을 때
  • PERSIST: 영속 => 저장할 때만 적용하고 싶을 때
  • REMOVE: 삭제
  • MERGE: 병합
  • REFRESH
  • DETACH

3. 주의점

  • 일대다에 전부 적용할 필요는 X
  • 하나의 부모가 자식들을 전부 관리할 때 적용

    📌소유자가 하나일 때, 단일 엔티티에 완전히 종속적일 때, 부모와 자식의 라이프사이클이 완전히 같을 때만 사용!!!

    • Child가 다른 엔티티와도 관계가 있을 경우에는 사용 X

0개의 댓글