CascadeType
CascadeType을 사용하여 관련된 엔티티를 함께 삭제할 수 있습니다. 이를 사용하면 관련된 객체가 함께 처리되므로 데이터 일관성을 유지할 수 있습니다.
예를 들어, reservation과 reservation_times 테이블 간에 @OneToMany 관계가 있다고 가정하면, Reservation 엔티티에서 다음과 같이 CascadeType 설정을 추가할 수 있습니다.
@Entity
public class Reservation {
// ...
@OneToMany(mappedBy = "reservation", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ReservationTime> reservationTimes;
// ...
}
이렇게 설정하면, reservation 엔티티를 삭제할 때 연관된 reservation_times 엔티티도 함께 삭제됩니다. 또한 orphanRemoval = true 설정을 추가하여, Reservation 객체에서 ReservationTime 객체를 제거할 때 데이터베이스에서도 해당 객체가 삭제되게 할 수 있습니다.
이러한 설정을 사용하면, 연관된 객체를 함께 삭제하려고 할 때 데이터 일관성을 유지할 수 있지만, 테이블 간의 종속성에 따라 적절한 CascadeType을 선택하는 것이 중요합니다. 적절한 종류의 CascadeType 설정은 다음과 같습니다.
CascadeType.PERSIST: 부모 엔티티가 저장될 때 자식 엔티티도 함께 저장됩니다.
CascadeType.MERGE: 부모 엔티티가 병합될 때 자식 엔티티도 함께 병합됩니다.
CascadeType.REMOVE: 부모 엔티티가 삭제될 때 자식 엔티티도 함께 삭제됩니다.
CascadeType.DETACH: 부모 엔티티가 detach 상태로 변경될 때 자식 엔티티도 함께 detach 상태로 변경됩니다.
CascadeType.ALL: 모든 종류의 cascade 작업이 적용됩니다.
그러나 데이터베이스 수준에서 외래 키 제약 조건을 해결하는 것과는 별개입니다. 따라서 외래 키 제약 조건으로 인한 문제를 해결하려면 데이터베이스에서 외래 키 제약 조건을 삭제하거나 적절한 순서로 작업을 수행해야 합니다.