[JPA] CascadeType 정리

동일 트랜잭션 내부

  1. 연관 엔티티가 수정되었을 경우 CascadeType과 상관없이 자동으로 수정됩니다.
  2. 같은 트랜젝션이라 하더라도 해당 엔티티가 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() 상태가 되어 변경 사항이 반영되지 않습니다.

고려사항

  • 부모/자식 간의 관계를 설정하는 과정에서 부모가 데이터베이스에 존재하지 않는 경우 데이터 무결성의 문제가 발생합니다.
  • 자식 레코드를 삭제하지 않은 상태에서 부모 레코드를 먼저 삭제하려 시도하는 경우 참조 무결성 위반이 발생합니다.

참고

Share