본문 바로가기

Spring boot

[spring boot] 영속성 전이 (cascade)와 orphanRemoval 차이

영속성 전이(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

참조를 변경시켜 무결성 오류를 안나게 할 뿐, 자식 데이터는 남겨둔다.