[JPA] CascadeType 영속성 전이
** 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 옵션은 부모 객체와의 연관관계가 끊어지면 고아객체가 되고, 고아객체를 자동으로 삭제해주는 옵션.
** 옵션 사용시 고려해야 할 점
연관관계를 맺은 엔티티들이 함께 저장되고 관리되는지 추적해보며 생각해봐야 한다.