동일 트랜잭션 내부
- 연관 엔티티가 수정되었을 경우 CascadeType과 상관없이 자동으로 수정됩니다.
- 같은 트랜젝션이라 하더라도 해당 엔티티가
CasecadeType.PERSIST
로 설정 되어 있지 않으면 연관 엔티티를 추가하더라도 반영되지 않습니다. (CascadeType.MERGE
로 설정 되어도 추가는 되지 않음)
CascadeType 별 동작
CascadeType.ALL
- 상위 엔티티에서 하위 엔티티로 모든 작업을 전파합니다.
- 모든 Cascade 설정을 적용합니다.
CascadeType.PERSIST
- 상위 엔티티를 생성하고, 하위 엔티티를 추가하였을 때
persist()
를 수행하면 하위 엔티티도 같이 persist()
가 수행됩니다.
- 만약, 하위 엔티티가 DB에 등록된 키값을 가졌다면 detached entity passed to persist 예외가 발생합니다.
CascadeType.MERGE
- 트랜젝션이 종료되고 detach 상태에서 하위 엔티티를 추가하거나 변경된 이후에 상위 엔티티가
merge()
를 수행하게 되면 변경 사항이 적용됩니다.
- 하위 엔티티의 추가 및 수정 모두 반영됩니다.
CascadeType.REMOVE
- 삭제 시 연관된 하위 엔티티들도 같이 삭제됩니다.
CascadeType.DETACH
- 상위 엔티티가 detech()를 수행하게 되면 연관된 하위 엔티티도 detach() 상태가 되어 변경 사항이 반영되지 않습니다.
고려사항
- 부모/자식 간의 관계를 설정하는 과정에서 부모가 데이터베이스에 존재하지 않는 경우 데이터 무결성의 문제가 발생합니다.
- 자식 레코드를 삭제하지 않은 상태에서 부모 레코드를 먼저 삭제하려 시도하는 경우 참조 무결성 위반이 발생합니다.
참고