영속성 전이(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<>();
...
}
@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);
// Cascade를 사용하는 경우 한번에 영속 상태가 된다.
em.persist(parent);
- 연관 관계 매핑과 관계가 없다.
CascadeType.ALL, CascadeType.PERSIST, CascadeType.REMOVE
를 주로 사용한다.- 소유자가 한개인 경우 사용하는 것을 권장한다. 즉, 단일 엔티티에 대해서 연관 관계 엔티티가 종속적인 경우에 사용한다.
- 라이프 사이클이 유사할 때 사용한다.
- 단일 소유자인 경우에 사용한다. (Parent만 Child를 사용, 만약 다른 엔티티인 Member도 Child를 아는 경우 사용하지 않는다.)
고아 객체
- 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 고아 객체라고한다.
// Parent.class
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
// App
Parent findParent = em.find(Parent.class, parent.getId());
// 첫번재 자식 엔티티의 연관관계를 끊어줌
findParent.getChildList().remove(0); // Delete 쿼리 발생
orphanRemoval = true
를 설정하면 컬렉션에서 제거되는 엔티티 객체는 Delete 쿼리가 나간다.

- 단일 소유자인 경우 사용한다. 참조가 한 곳에서만 발생하는 경우에 사용한다.
- 부모 엔티티를 제거하는 경우에 연관관계에 있는 자식 엔티티가 모두 지워지고 그 후에 부모 엔티티가 제거된다. (CascadeType.REMOVE 처럼 사용된다.)
Parent findParent = em.find(Parent.class, parent.getId());
em.remove(parent); // 부모 엔티티가 삭제되면서 자식 엔티티도 모두 삭제된다.

영속성 전이, 고아 객체 생명 주기
- 부모 엔티티는 스스로 자신의 라이프 사이클을 관리한다.
- 부모 엔티티와 연관있는 자식 엔티티는
orphanRemoval = true, CascadeType.ALL
을 함께 사용하는 경우 부모 엔티티가 라이프 사이클을 관리할 수 있다.- 부모가 생성될 때 persist되면서 자식도 함께 영속 상태가 된다.
- 부모가 삭제되는 경우 자식도 함께 삭제된다.
📄 References
김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
반응형