영속성 전이

CascadeType.PERSIST

  • 사용 예: 부모 엔티티를 저장할 때 자식 엔티티도 자동으로 저장해야 할 때.

  • 상황: 부모와 자식이 함께 새로운 상태에서 영속성 컨텍스트에 추가될 때 유용합니다.

  • 예시: 새 부모 엔티티를 저장하면서 관련된 자식 엔티티도 동시에 저장하는 경우.

java코드 복사@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "species_id")
private Species species;

2. CascadeType.MERGE

  • 사용 예: 부모 엔티티를 병합할 때 자식 엔티티도 병합해야 할 때.

  • 상황: 부모와 자식 엔티티가 이미 존재하고, 업데이트 시 병합이 필요한 경우 유용합니다.

  • 예시: 부모 엔티티와 자식 엔티티가 이미 데이터베이스에 존재하며, 변경된 내용을 병합할 때 사용.

java코드 복사@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "species_id")
private Species species;

3. CascadeType.REMOVE

  • 사용 예: 부모 엔티티를 삭제할 때 자식 엔티티도 함께 삭제해야 할 때.

  • 상황: 부모-자식 관계가 강하게 결합되어 있어서 부모가 삭제될 때 자식도 삭제되는 것이 논리적일 때 유용합니다.

  • 예시: 부모 엔티티가 삭제되면 관련된 모든 자식 엔티티도 함께 삭제해야 할 때.

java코드 복사@ManyToOne(cascade = CascadeType.REMOVE)
@JoinColumn(name = "species_id")
private Species species;

4. CascadeType.REFRESH

  • 사용 예: 부모 엔티티를 새로 고침할 때 자식 엔티티도 함께 새로 고침해야 할 때.

  • 상황: 데이터의 일관성을 유지하기 위해 부모와 자식 엔티티를 새로 고침할 필요가 있을 때 유용합니다.

  • 예시: 부모 엔티티의 최신 상태를 유지하면서 자식 엔티티도 동일하게 유지해야 할 때.

java코드 복사@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "species_id")
private Species species;

5. CascadeType.DETACH

  • 사용 예: 부모 엔티티를 분리할 때 자식 엔티티도 함께 분리해야 할 때.

  • 상황: 영속성 컨텍스트에서 엔티티를 분리할 때 유용합니다.

  • 예시: 부모 엔티티를 영속성 컨텍스트에서 분리하면서 자식 엔티티도 분리해야 할 때.

java코드 복사@ManyToOne(cascade = CascadeType.DETACH)
@JoinColumn(name = "species_id")
private Species species;

6. CascadeType.ALL

  • 사용 예: 부모 엔티티에 대한 모든 작업(PERSIST, MERGE, REMOVE, REFRESH, DETACH)이 자식 엔티티에도 전파되어야 할 때.

  • 상황: 부모-자식 간의 강한 결합이 필요하고, 모든 작업이 자동으로 자식에게 전파되어야 할 때 유용합니다.

  • 예시: 부모 엔티티와 자식 엔티티 간의 강한 종속성이 있을 때 사용합니다.

java코드 복사@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "species_id")
private Species species;

일반적인 현업 사용 사례

  1. CascadeType.PERSIST와 CascadeType.MERGE 조합:

    • 새로운 부모 엔티티와 자식 엔티티를 동시에 저장하거나 기존 엔티티를 병합할 때 주로 사용합니다.

    • 예: 새로운 주문과 주문 항목을 동시에 저장하거나 기존 주문을 업데이트할 때.

  2. CascadeType.REMOVE:

    • 부모 엔티티가 삭제될 때 자식 엔티티도 함께 삭제해야 하는 경우에 사용합니다.

    • 예: 계정 삭제 시 해당 계정에 속한 모든 데이터도 삭제해야 할 때.

  3. CascadeType.ALL:

    • 부모와 자식 간의 강한 결합이 있어 모든 작업이 자식에게도 전파되어야 하는 경우에 사용합니다.

    • 예: 트랜잭션 관리가 중요한 경우에 전체적인 데이터 일관성을 유지하기 위해 사용.

Last updated