Java/JPA

영속성 전이 : CASCADE

amungstudy 2023. 11. 17. 21:40

영속성 전이는 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공해준다

(ex.부모 엔티티 저장시에 자식 엔티티도 함께 저장)


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

cascade 속성을 사용할 수 있는 경우:

하나의 부모가 자식들을 관리할때,

ex)parent 말고 member가 child를 알게되면 쓰면 안된다.... 단일 엔티티에 완전히 종속적일때(소유자가 하나일때), life cycle 동일할때(등록,삭제)

ex 게시판-첨부파일 경로(다른 엔티티랑 관련 있으면 쓰면 안됨. 소유자가 하나일때만 사용)

 

고아객체제거 : 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제

orphanRemoval = true

Parent parent1 = em.find(Parent.class, id); 
parent1.getChildren().remove(0);
//자식 엔티티를 컬렉션에서 제거

고아 객체제거도 참조하는 곳이 하나일 때 사용해야함. (특정 엔티티가 개인 소유하는 경우)

@OneToOne, @OneToMany만 가능

 

* 부모 엔티티 삭제 시
CascadeType.REMOVEorphanRemoval = true는 부모 엔티티를 삭제하면 자식 엔티티도 삭제한다.

  • 부모 엔티티에서 자식 엔티티를 제거하면
    CascadeType.REMOVE는 자식 엔티티가 그대로 남아 있다.
    orphanRemoval = true는 자식 엔티티를 제거한다.

두 경우 모두 자식 엔티티에 딱 하나의 부모 엔티티가 연관되어 있는 경우에만 사용해야한다.

 

영속성 전이 + 고아 객체

두 옵션을 모두 활성화하면 부모 엔티티를 통해서 자식의 생명주기를 관리할 수 있다.

도메인 주도 설계(DDD)의 Aggregate Root개념을 구현할 때 유용