> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/jpa-basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/jpa-basic/8./cascade.md).

# 영속성 전이(CASCADE)와 고아 객체

지연 로딩/즉시 로딩과 관계 없음

**특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만든다.**

예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장.

CASCADE 종류

* ALL : 영속과 삭제 모두 적용 => 라이프사이클 맞을 때
* PERSIST : 영속. 저장할 때만 맞추고 나머지는 따로 관리
* REMOVE : 삭제.

**cascase 옵션은 언제 쓰는가?** \
**단일 엔티티에 완전 종속적일 때 , 라이프사이클이 동일할 때**\
\=>소유자가 하나일 때! 오직 하나의 객체만이 자신에게 속한 객체들에 사용할 때 cascade 옵션이 유용하다!\
**단, 소유자(A) 뿐만 아니라 다른 객체들도 소유자(A)에 속한 객체들을 사용하고 있을 때는 쓰면 안 된다. 소유자(A) 때문에 속한 객체 데이터들이 수정되면 참조하고 있던 다른 객체들은 이상한 값을 참조하기 때문이다!**

고아 객체 :&#x20;

* **참조가 제거된 자식 엔티티는 다른 곳에서 참조하지 않는 고아 객체로**

  **보고 삭제하는 기능**
* 참고: 개념적으로 **부모를 제거하면 자식은 고아**가 된다. 따라서 **고아 객체 제거 기능을 활성**화 하면, ⭐️**부모를 제거할 때 자식도 함께 제거**된다. 이것은 **⭐️CascadeType.REMOVE처럼 동작**한다.

```
Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0); 
```

영속성 전이 + 고아 객체, 생명주기

* CascadeType.ALL + orphanRemovel=true
* **부모 엔티티를 통해서 자식의 생명 주기를 관리**할 수 있음\
  ex) **JPA가 parent 관리**하고 있다.(영속성 컨텍스트에 의해)\
  **자식 엔티티의 생명주기는 부모가 관리**한다.
* 도메인 줃도 설계(DDD)의 Aggregate Root 개념 구현 시에 유용하다!\
  Repository는 Aggregate Root만 컨택하고, 나머지는 Repository로 만들지 않는다(혹은 만들지 않는 것이 더 유용하다.)
* parent = Aggregate 루트
* child 엔티티는 루트(parent)가 관리.
