[JPA] CascadeType 영속성 전이

2023. 11. 6. 14:33
728x90

 

** Cascade?

특정 엔티티를 영속 상태로 만들 경우, 연관된 엔티티도 함께 영속 상태로 만들고 싶을 경우에 영속성 전이 사용.

자식 엔티티에 설정.

@OneToMany(mappedBy="books", cascade=CascadeType.ALL)

 

CASCADE OPTIONS

ex) IMAGES 부모 / BOOKS 자식

1) ALL

2) PERSIST

: 부모와 자식 엔티티를 한 번에 영속화 가능

ex) IMAGES를 영속화 했을 경우, BOOKS도 함께 영속화됨.

3) MERGE

: 엔티티 상태 병합 시 자식 엔티티도 함께 병합

트랜잭션이 종료되고 detach 상태에서 엔티티가 merge()를 수행하게 되면 > 자식 엔티티의 추가 및 수정사항도 함께 적용됨.

4) REMOVE

: 부모 객체를 삭제하면 연관되어 있는 자식 객체들이 삭제됨.

ex) IMAGES 객체 삭제시 BOOKS 객체도 함께 삭제됨.

5) REFRESH

: 엔티티 새로 고칠 때 자식 엔티티도 새로고침

6) DETACH

: 부모 엔티티가 detach()를 수행하게 되면, 자식 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않음.

 

 

CF) CascadeType.Remove       vs.    orphanRemoval = true

- 부모 엔티티에서 자식 엔티티와의 연관관계를 제거하는 경우 (부모 엔티티에서 자식 엔티티 제거 시!!!) 

a) CascadeType.Remove 옵션은 참조를 변경시켜서 무결성 오류를 안나게 할 뿐 데이터는 남아있게 된다. (자식 객체 그대로 남아있다.....)

b) orphanRemoval=true 옵션은 부모 객체와의 연관관계가 끊어지면 고아객체가 되고, 고아객체를 자동으로 삭제해주는 옵션.

 

 

** 옵션 사용시 고려해야 할 점 

연관관계를 맺은 엔티티들이 함께 저장되고 관리되는지 추적해보며 생각해봐야 한다. 

728x90