영속성 전이(CASCADE)와 고아 객체
지연 로딩/즉시 로딩과 관계 없음
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만든다.
예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장.
CASCADE 종류
ALL : 영속과 삭제 모두 적용 => 라이프사이클 맞을 때
PERSIST : 영속. 저장할 때만 맞추고 나머지는 따로 관리
REMOVE : 삭제.
cascase 옵션은 언제 쓰는가? 단일 엔티티에 완전 종속적일 때 , 라이프사이클이 동일할 때 =>소유자가 하나일 때! 오직 하나의 객체만이 자신에게 속한 객체들에 사용할 때 cascade 옵션이 유용하다! 단, 소유자(A) 뿐만 아니라 다른 객체들도 소유자(A)에 속한 객체들을 사용하고 있을 때는 쓰면 안 된다. 소유자(A) 때문에 속한 객체 데이터들이 수정되면 참조하고 있던 다른 객체들은 이상한 값을 참조하기 때문이다!
고아 객체 :
참조가 제거된 자식 엔티티는 다른 곳에서 참조하지 않는 고아 객체로
보고 삭제하는 기능
참고: 개념적으로 부모를 제거하면 자식은 고아가 된다. 따라서 고아 객체 제거 기능을 활성화 하면, ⭐️부모를 제거할 때 자식도 함께 제거된다. 이것은 ⭐️CascadeType.REMOVE처럼 동작한다.
영속성 전이 + 고아 객체, 생명주기
CascadeType.ALL + orphanRemovel=true
부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있음 ex) JPA가 parent 관리하고 있다.(영속성 컨텍스트에 의해) 자식 엔티티의 생명주기는 부모가 관리한다.
도메인 줃도 설계(DDD)의 Aggregate Root 개념 구현 시에 유용하다! Repository는 Aggregate Root만 컨택하고, 나머지는 Repository로 만들지 않는다(혹은 만들지 않는 것이 더 유용하다.)
parent = Aggregate 루트
child 엔티티는 루트(parent)가 관리.
Last updated