[JPA] 영속성 전이: CASCADE

Noah-wilson·2025년 1월 9일

JPA

목록 보기
10/10
post-thumbnail

영속성 전이(CASCADE) 란?

특정 엔티티를 영속 상태로 만들 떄 연관되어 있는 엔티티도 함께 영속 상태로 만드는것이다.

만약 Parent 객체와 child 객체가 연관되어 있다고 가정하자.

@Entity
public class Parent {
    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "parent")
    private List<Child> childList=new ArrayList<Child>();
}
@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);

            em.persist(parent);
            em.persist(child1);
            em.persist(child2);

child객체의 갯수만큼 계속 persist하면 너무 귀찮다!
이때 사용하는 것이 cascade다.

@Entity
public class Parent {
    @Id
    @GeneratedValue
    private Long id;
    private String name;

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

}

child 코드는 동일하다.

            Child child1 = new Child();
            Child child2 = new Child();

            Parent parent = new Parent();
            parent.addChild(child1);
            parent.addChild(child2);

            em.persist(parent);

실행 결과:

Hibernate: 
    /* insert for
        hellojpa.Parent */insert 
    into
        Parent (name, id) 
    values
        (?, ?)
Hibernate: 
    /* insert for
        hellojpa.Child */insert 
    into
        Child (name, parent_id, id) 
    values
        (?, ?, ?)
Hibernate: 
    /* insert for
        hellojpa.Child */insert 
    into
        Child (name, parent_id, id) 
    values
        (?, ?, ?)

Parent에 cascade = CascadeType.ALL을 설정해줌으로 Parent객체만 persist해도 자식객체가 전부 저장된다.

헷갈릴수도 있지만 영속성 전이(cascade)는 연관관계를 매핑하는 것과 아무 관련이 없다. 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함
을 제공할 뿐이다.

주의사항

참조하는 곳이 하나일 때 사용해야한다.(자식 엔티티가 서로 다른 2개 이상의 부모 엔티티가 연관관계를 갖고있다면 조심해야 한다.)

참고로 CASCADE의 종류는 All, persist, remove, merge, refresh, detach가 있다.

고아객체란?

고아 객체는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 말한다.

orphanRemoval = true 옵션

참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능

  • @OneToOne, @OneToMany만 가능
  • 참조하는 곳이 하나일 때 사용해야한다.(자식 엔티티가 서로 다른 2개 이상의 부모 엔티티가 연관관계를 갖고있다면 조심해야 한다.)
  • 특정 엔티티가 개인 소유할 때 사용

참고 자료 출처: 출처

0개의 댓글