작성
·
15
0
안녕하세요. Order와 OrderItem엔티티에 있는 CASCADE에 대해 기본편을 복습해도 헷갈린 부분이 있어서 질문드립니다.
em.persist(order)를 하면 CascadeType.ALL때문에 Delivery랑 OrderItem도 insert가 되는거 같은데,
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order;
OrderItem에 있는 이 부분에 CASCADE를 적어준게 아니라
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>();
왜 Order에 있는 여기에다가 CASCADE를 적어준것일까요? 어디에다 두어도 상관없을거 같은데, 특별한 규칙이 있는것인지 질문드립니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님.
질문해주신 @OneToMany
와 @ManyToOne
관계에서 CascadeType
의 사용에 대한 혼동이 이해됩니다.
CascadeType
은 주로 부모-자식 관계에서 부모 엔티티에 설정됩니다. 여기서 “부모”는 외래 키 관계에서 연관 관계의 주인이 아닌, 이 연관 관계를 소유하고 있는 쪽입니다.
@OneToMany
에 CascadeType을 설정할까요?부모 엔티티 중심: @OneToMany
관계에서는 부모 엔티티(이 경우 Order)가 자식 엔티티(여러 OrderItem)를 가지고 있는 구조입니다. 부모의 생명주기와 자식의 생명주기를 동일하게 관리하고 싶다면 부모 엔티티의 @OneToMany
연관 관계에 CascadeType
을 설정합니다.
관리 편리성: Order
를 저장할 때 연관된 OrderItem
도 함께 저장하려면 Order
에 CascadeType.ALL
을 설정하는 것이 더 자연스러운 방법입니다. 이는 종속된 엔티티의 저장, 삭제 등을 하나의 트랜잭션에서 관리할 수 있게 합니다.
@ManyToOne
에서 CascadeType 설정하지 않는 이유@ManyToOne
관계에서는 일반적으로 자식 엔티티(여러 OrderItem)가 부모 엔티티(Order)를 참조하는 상황입니다. 변동 사항이 있을 때마다 자식 엔티티에서 참조하는 부모 엔티티의 데이터를 함께 변경할 이유는 크게 없기 때문이죠. 그래서 CascadeType
은 주로 자식의 생명주기를 관리할 필요가 있을 때 사용합니다.
결국, CascadeType
을 어디에 설정하느냐는 엔티티 사이의 연관관계와 해당 어플리케이션에서의 사용 사례에 따라 다릅니다. 보통 부모-자식 관계에서 부모에 설정을 하고, 부모를 통해 자식들을 관리하는 방식이 일반적입니다.
보다 구체적인 예시와 설명이 필요하면, 아래 비슷한 질문의 URL을 참고하시면 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.