연관관계 메서드에 대해 질문드립니다.
208
작성한 질문수 31
@Entity
@Table(name = "orders")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order {
@Id @GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "delivery_id")
private Delivery delivery; //배송정보
private LocalDateTime orderDate; //주문시간
@Enumerated(EnumType.STRING)
private OrderStatus status; //주문상태 [ORDER, CANCEL]
//==연관관계 메서드==//
public void setMember(Member member) {
this.member = member;
member.getOrders().add(this); // Member 엔티티 부분 : private List<Order> orders = new ArrayList<>();
}
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem); // OrderItem 엔티티 부분 : private Order order;
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery) {
this.delivery = delivery; // Delibery 엔티티 부분 : private Order order;
delivery.setOrder(this);
}
member.getOrders().add(this)
-> addOrderItem과 setDelivery에서는 setOrder(this)로 연관관계를 설정해줬는데, 왜 setMember 메소드에서만 getOrders().add(this)로 연관관계를 설정한 것인가요? Member 엔티티의 orders메소드가 List라 그런 것인가요?
setMember에서는 같은 List임에도 불구하고 this.member = member라고 했는데, 왜 여기서는 add(orderItem)으로 연관관계를 설정한 것인가요? orderItems가 List라서 그런 것인가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
whdk333님의 질문에 대해 답변드리겠습니다.
setMember메소드에서getOrders().add(this)로 연관관계를 설정한 이유는Order엔티티와Member엔티티 간의 양방향 연관 관계를 맺기 위함입니다.Member엔티티의orders필드가List<Order>타입으로 여러Order엔티티를 참조할 수 있기 때문에,Order엔티티를 생성하고Member엔티티에 연결할 때Member의orders리스트에 해당Order엔티티를 추가함으로써 양방향 매핑을 완성합니다. 이 경우Member엔티티 내부의List<Order>에Order인스턴스를 추가해야 하므로getOrders().add(this)를 사용합니다.setMember메소드와addOrderItem메소드의 차이는 연관관계의 주체가 무엇이냐에 따라 달라집니다.setMember에서this.member = member와 같이 설정하는 것은Order엔티티 입장에서Member엔티티를 설정하는 것입니다. 한편,addOrderItem에서orderItems.add(orderItem)을 호출하는 이유는Order엔티티가 여러 개의OrderItem엔티티를 갖는 컬렉션을 관리하기 때문입니다. 여기서OrderItem엔티티 각각에 대해 역방향으로Order엔티티를 설정하기 위해orderItem.setOrder(this)를 호출합니다. 즉,Order엔티티와OrderItem엔티티는 1:N 관계에 있으며,Order엔티티에 속한OrderItem들을 관리하기 위한 연관관계 메서드가 필요한 것입니다.
어떤 연관관계 메서드를 사용하느냐는 해당 엔티티 간의 관계와 개념적인 모델링에 따라 달라집니다. 연관관계 설정 시 어떤 엔티티가 컨트롤하는 쪽인지, 어떤 방식으로 데이터가 연결되는지를 기준으로 메서드를 구현하게 됩니다.
Spring AI 프레임워크를 사용하지 않은 이유
0
33
1
SpringBoot4 버전 Hibernate5JakartaModule 라이브러리 오류
0
31
1
강사님 질문 있어요.
0
40
2
RestTemplate과 webClient, RestClient에 대해서 질문드립니다.
0
36
2
회원 도메인 인터페이스 개발
0
41
1
setter 사용하지 않기
0
38
1
세션을 제대로 이해한게 맞는지 궁금합니다
0
29
1
jsp의 상대경로와 Controller에서 반환하는 이름이 달라도 괜찮나요?
0
29
1
안녕하세요 토비님 혹시 완성된 코드의 repository 주소는 없을까요?
0
48
2
자막 오타 제보
0
40
1
운영환경에 적용해볼 수 없을때...고민입니다 ㅠㅠ
0
45
1
빈 스코프 개념의 중요성
0
31
1
트랙잭션 격리수준 선택에 대해서 질문
0
32
1
안녕하세요 치킨 디도스 이벤트 보고 흉내내보려 들어왔습니다..
0
40
2
실무 내용 문의드려요
0
33
2
SingletonService가 JVM이 뜰 때 생성되는게 맞나요?
0
78
2
임포트 오류
0
42
2
답을언제쯤받아볼수있나요
0
82
2
형 책 어떻게 받아?
1
75
1
@JsonIgnore 이후 Internal Server Error가 발생하지 않습니다.
0
62
3
mvc 패턴 - 적용 강의에서 회원가입할 때 redirect가 아닌 forward인 이유가 궁금합니다.
0
42
1
프로젝트가 없어요..
0
86
2
JpaCursorItemReader의 정렬 조건 부재의 영향
1
57
2
changeTeam 메서드 질문
0
45
1





