반응형
Cascade (영속성 전이)
- 사용 위치
- 연관관계의 주인 반대편 - 부모 엔티티(다대일에서 일)
- 즉, @OneToMany 가 있는 쪽 (@OneToOne 도 가능)
- 예를들어, 게시글과 첨부파일이라면 일에 해당하는 게시글에 설정한다.
- 사용 조건
- 양쪽 엔티티의 라이프사이클이 동일하거나 비슷해야한다. (게시글이 삭제되면 첨부파일도 같이 삭제 되어야 하는 경우)
- 대상 엔티티로의 영속성 전이는 현재 엔티티에서만 전이 되어야 하며, 다른 곳에서 또 걸면 안 된다. (첨부파일을 게시글이 아닌 다른곳에서 영속성 전이를 하면 안됨)
- 옵션 종류
- ALL : 전체 상태 전이
- PERSIST : 저장 상태 전이
- REMOVE : 삭제 상태 전이
- MERGE : 업데이트 상태 전이
- REFERESH : 갱신 상태 전이
- DETACH : 비영속성 상태 전이
orphanRemoval (고아 객체 제거)
- 사용 위치
- @OneToMany 또는 @OneToOne 에서 사용 - 부모 엔티티
- 사용법
- Cascade.REMOVE 와 비슷한 용도로 삭제를 전파하는데 쓰인다.
- 부모 객체에서 리스트 요소삭제를 했을경우 해당 자식 객체는 매핑정보가 없어지므로 대신 삭제해준다.
- 요건 DB 에서는 절대 알 수 없는 행동
Parent parent1 = em.find(Parent.class, parent.getId()); parent1.getChildList().remove(0); // delete 쿼리나간다.
그렇다면 Cascade.REMOVE 와 orphanRemoval 차이점은 orphanRemoval=true 는 위 케이스도 포함하며,
일에 해당하는 부모 엔티티의 리스트에서 요소를 삭제하기만 해도 해당하며
다에 해당하는 자식 엔티티가 delete되는 기능까지 포함하고 있다.
- 즉, orphanRemoval=true 는 리스트 요소로써의 영속성 전이도 해준다는 뜻
- Cascade.REMOVE의 경우 일에 해당하는 부모 엔티티를 em.remove를 통해 직접 삭제할 때,그 아래에 있는 다에 해당하는 자식 엔티티들이 삭제되는 것입니다.
영속성 전이 최강 조합 : orphanRemoval=true + Cascade.ALL
위 2개를 함께 설정하면 자식 엔티티의 라이프 사이클이 부모 엔티티와 동일해지며, 직접 자식 엔티티의 생명주기를 관리할 수 있게 되므로 자식 엔티티의 Repository 조차 없어도 된다. (따라서, 매핑 테이블에서 많이 쓰임)
반응형
'TIL ✍️' 카테고리의 다른 글
23년 12월 21일(목요일) - 57번째 TIL (0) | 2023.12.21 |
---|---|
23년 12월 20일(수요일) - 56번째 TIL : 레포지토리 단에서 예외 발생 (0) | 2023.12.20 |
23년 12월 18일(월요일) - 54번째 TIL : QueryDSL (0) | 2023.12.18 |
23년 12월 15일(금요일) - 53번째 TIL (0) | 2023.12.15 |
23년 12월 14일(목요일) - 52번째 TIL (0) | 2023.12.14 |