영속성 전이(CASCADE)와 고아 객체
CASCADE는 즉시로딩이나 연관관계와 상관 x
parent만 persist해주면 chlid도 자동으로 persist됐으면 좋겠을 때 사용
@OneToMany (mappedBy="parent", cascade = CascadeType.ALL)
one에 사용하는 것이며 cascade all로 해주면 그 field childList에 들어가는 child들은 다 자동으로 persist됨.
----------------
ALL : 전체 다 life cycle 맞춰야 할 때 (orphanRemove안해도 parent 지우면 chlid도 다 지워짐)
persist : 저장할때만 life cycle 맞추고 싶을 때 사용, 나머지(remove)는 위험하니까 따로 두고 싶을 때
-------------------------------------------
사용
하나의 부모가 여러 자식을 관리할 때 (소유자가 하나일때) (게시판 등)= parent만 child를 소유할 때 (다른 class인 member가 child를 소유하면 안됨)
저장, 삭제 시기가 비슷할 때
ex)
delivery 생성
orderItem생성
order생성
orderRepository.save(order);
는 order의 delivery와 orderItem이 cascade.all이라서 가능
(cascader = order persist할 때 delivery랑 orderItems도 같이 persist해줘)
사용 금지
child가 다른 부모랑도 연관되어 있을 때는 사용하면 안됨.
child에서 다른 entity로 나가는건 상관없는데 다른 entity가 child를 알게되면 사용금지
----------------
parent의 생명주기는 jpa가 관리해주는데 child는 parent가 관리해줘서 레파지토리를 안 만들어줘도 됨.
orphanRemoval
이 둘의 차이점은 관계가 끊어졌을 때 남은 데이터에 대한 동작 차이이다.
orPhanRemoval
부모와 자식의 관계가 끊어졌을 때,
자식 데이터까지 삭제해주는 역할을 하고,
CascadeType.Remove
참조를 변경시켜 무결성 오류를 안나게 할 뿐, 자식 데이터는 남겨둔다.
'Spring boot' 카테고리의 다른 글
[spring boot] 3차 정리 (값 타입) (0) | 2022.01.21 |
---|---|
[spring boot] 변경감지(dirty checking)와 병합(merge) (0) | 2022.01.20 |
[spring boot] 실전! (0) | 2022.01.10 |
[spring boot] 각 join 특징 (+ on, where 차이) (0) | 2021.12.27 |
[spring boot] OSIV와 영속성 컨텍스트 (0) | 2021.12.08 |