@Entity
@Table(name = "orders") //이름 없으면 테이블명이 Order가 됨
public class Order {
@Id @GeneratedValue // db에 자동 생성(개발자가 안 지정해줘도 됌)
@Column(name = "order_id")
private Long id;
@ManyToOne(fetch = LAZY) //주문 여러개가 회원 한명에게 매핑되기 때문에
@JoinColumn(name = "member_id") //Member 엔티티에 매핑을 뭐로 할껀지
private Member member;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)// OrderItem 의 order 속성에 매핑을 당하는 입장(주인x)
private List<OrderItem> orderItems = new ArrayList<>(); //한번 주문할때 상품 여러개 들어있을 수 있으므로
@OneToOne(fetch = LAZY)
@JoinColumn(name = "delivery_id") //주인(왜래키 보유)
private Delivery delivery;
private LocalDateTime orderDate;//시간, 분, 초 까지 다 있음(hibernate 가 자동지원 해줌)
@Enumerated(EnumType.STRING)
private OrderStatus status;// 주문 상태 [ORDER, CANCEL]
}
위 코드에서 CascadeType.ALL의 기능이 뭐야?
CascadeType.ALL은 JPA(Java Persistence API)에서 관계 매핑 시 사용되는 옵션 중 하나로, 연관된 엔티티들의 변경을 어떻게 처리할지 지정하는 것입니다. 즉, 부모 엔티티가 영속성 상태(PERSIST, MERGE, REMOVE 등)가 변경될 때 연관된 자식 엔티티들도 같이 해당 변경을 따라가도록 설정하는 것입니다.
CascadeType.ALL은 다음과 같은 모든 영속성 컨텍스트 상태 변경을 자식 엔티티에 적용합니다:
PERSIST: 부모 엔티티가 새로 추가될 때, 연관된 자식 엔티티도 함께 영속성 컨텍스트에 추가됩니다.
MERGE: 부모 엔티티가 변경되어 병합될 때, 연관된 자식 엔티티도 함께 변경 및 병합됩니다.
REMOVE: 부모 엔티티가 삭제될 때, 연관된 자식 엔티티도 함께 삭제됩니다.
REFRESH: 부모 엔티티가 리프레시될 때, 연관된 자식 엔티티도 함께 리프레시됩니다.
DETACH: 부모 엔티티가 분리(detached)될 때, 연관된 자식 엔티티도 함께 분리됩니다.
ALL: 모든 상태 변경을 자식 엔티티에 적용합니다. 위에 나열된 모든 상태를 포함하는 옵션입니다.
예를 들어, 주문(Order) 엔티티에 CascadeType.ALL을 설정하면, 해당 주문이 영속성 컨텍스트에 추가(PERSIST)되거나 변경(MERGE)되거나 삭제(REMOVE)될 때, 주문과 연관된 주문 상품(OrderItem) 엔티티들도 모두 같은 영향을 받게 됩니다. 따라서 주문을 추가, 변경, 삭제할 때 연관된 주문 상품도 자동으로 추가, 변경, 삭제될 수 있습니다. 이렇게 함으로써 연관된 엔티티들을 관리하는데 편리함을 제공할 수 있습니다.