Section 1. 영속성 전이 (CASCADE)
1. 영속성 전이 (CASCADE)
" cascade : 폭포, 폭포처럼 흐르다 " 라는 사전적 의미를 바탕으로 엔티티의 상태를 변경할 때 해당 엔티티와 연관된 엔티티의 상태 변화를 전파시키는 옵션
- 부모는 One 에 해당하는 Entity
- 자식은 Many 에 해당하는 Entity
- 부모 Entity 가 존재해야 자식 Entity 가 부모를 참조하며 생성될 수 있음
2. CASCADE 종류
CASCADE | 설명 |
---|
PERSIST | 부모가 영속화될 때 자식도 영속화 |
MERGE | 부모가 병합될 때 자식도 병합 |
REMOVE | 부모가 삭제될 때 자식도 삭제 |
REFRESH | 부모가 refresh 되면 자식도 refresh |
DETACH | 부모가 detach 되면 자식도 detach |
ALL | 부모의 상태 변화를 자식에게 모두 전이 |
3. 주문 영속성 전이
- 부모인 Order Entity 가 저장될 때, 자식인 OrderItem 또한 저장되는 영속성 전이
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F3281eb05-5f60-4c95-8628-2e9b573d879d%2Fimage.png)
- OrderRepository 생성
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F58df3167-c0c9-44ec-a04b-582078698f47%2Fimage.png)
- 부모 Order Entity CASCADE 지정
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F6ff20fc9-7def-4756-b66b-48c9d3c77de2%2Fimage.png)
4. 주문 영속성 전이 테스트
- 주문 영속성 전이 테스트 클래스 생성 및 DI
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F5a05a926-6ca0-4e7b-9697-32dddbb6b589%2Fimage.png)
- 주문 영속성 전이 테스트
- Order 객체 저장 시, 참조되는 Order_Item 객체 저장
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F8544c9bf-8882-4c3e-b8f5-de9dac67f3f1%2Fimage.png)
- 3개의 Item 생성
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fbc89f4c4-cf64-444b-816f-07230bf6e494%2Fimage.png)
- orders 생성
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F21289304-6163-42d3-832b-a3e0673d5d04%2Fimage.png)
- order_item 생성
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F404e3e40-b7e6-4463-86fe-c89075ecd733%2Fimage.png)
- order 객체 조회
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fb583cab9-1d13-4aa9-811b-89f8297a6f2e%2Fimage.png)
Section 2. 고아객체 (ORPHAN)
1. 고아객체 (ORPHAN)
부모 엔티티와 연관 관계가 끊어진 자식 엔티티
- 자식의 엔티티를 다른 엔티티가 참조하고 있다면 제거 X
2. 고아객체 제거
- 부모 Entity 에 orphanRemoval = true 설정
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F4ceeb74b-b207-4f6f-9d68-5a457e70762a%2Fimage.png)
3. 고아객체 제거 테스트
- 부모 Entity 인 Order 객체 생성
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fc95301b4-a90f-49df-9777-0a3384381f20%2Fimage.png)
- 고아 객체 제거
- Order 객체가 관리하는 OrderItem 리스트에서 0번째 요소의 id를 추출
- 0번째 요소를 제거한 뒤, OrderItem 조회 (id 이용)
- 조회 결과 Optional.empty() 라면 제대로 제거된 것이므로 테스트 통과
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F473e852b-9bf2-4610-97e7-42a1b24ea9bf%2Fimage.png)
- order_item delete
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fde8a3589-6965-4007-b636-74db47ce2f01%2Fimage.png)
4. CASCADE.REMOVE vs 고아객체 제거
- CASCADE.REMOVE - 부모 Entity 가 삭제될 때 같이 삭제되는 것
- 고아객체 제거 - 부모 Entity 와의 연관관계가 끊어질 때 삭제되는 것