연관관계 메서드에 대해 질문드립니다.
212
작성한 질문수 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들을 관리하기 위한 연관관계 메서드가 필요한 것입니다.
어떤 연관관계 메서드를 사용하느냐는 해당 엔티티 간의 관계와 개념적인 모델링에 따라 달라집니다. 연관관계 설정 시 어떤 엔티티가 컨트롤하는 쪽인지, 어떤 방식으로 데이터가 연결되는지를 기준으로 메서드를 구현하게 됩니다.
섹션2, 대화&세션관리 수업 자료 누락
0
10
1
HelloSpringApplication.java 클래스 실행 오류
0
15
1
build 시 에러 해결방법 공유(docker.desktop 업데이트 -> 의존성 버전 수정)
0
37
2
네이버 API | '검색 - 책' API 제공 중단
0
47
2
Part 2 듣기전 복습하던 중, 아키텍처에 관한 질문이 있습니다.
0
49
2
장치 의존성과 CSR
0
36
1
테스트는 인터페이스를 대상으로 만드는것에 대해 궁금한 점이 있습니다.
0
32
1
[영한님]Spring Boot 및 프로젝트 생성
0
60
2
JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문
0
57
3
강의 요청 문의
0
40
2
클로드코드 명령어-대화&세션관리 수업 자료
0
43
1
PlatformTransactionManager, ResourcelessTransactionManager 질문
1
68
2
자료 한번에 다운받기
0
33
1
스프링 빈 등록 방법 2가지 다 알아야하는 이유
0
59
1
mybatis 를 이용한 crud에서 insert에서 resultType='long" 이라고 하셨는데요,
0
28
1
설계 트레이드 오프 링크 접속 안됨
0
85
2
테스트 질문, 어떤것을 사용할것인것에 대해서
0
46
1
깃허브주소 궁금합니다.
0
36
2
mariaDB 설정
0
33
1
섹션4 퀴즈 오타있어요.
0
48
1
AWS 배포 성능테스트
0
76
2
퀴즈가 안열려요
0
76
2
7강 보고 있는데요.. 글자가 너무 작아요
0
44
1
트래잭션 전파 기본- 에 대한 개념 질문? 이렇게 생각해도 맞나요?
0
47
1





