인프런 커뮤니티 질문&답변

빛혜원님의 프로필 이미지
빛혜원

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

회원 서비스 개발

연관관계 관련 질문입니다.

작성

·

282

0

@Entity
@Table(name = "ORDERS")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "order_id", nullable = false)
  private Long id;

  @ManyToOne(fetch = FetchType.LAZY) //연관관계 주인
  @JoinColumn(name = "user_id")
  private User user;

  @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<OrderItem> orderItems = new ArrayList<>();

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "delivery_id")
  private Delivery delivery; //배송정보

  @Enumerated(EnumType.STRING)
  private OrderStatus status; //ORDER, CANCEL


  private LocalDateTime orderDate;// 주문 날짜

  public Order(User user) {
    this.user = user;
  }

  @Builder
  public Order(User user, Delivery delivery, OrderStatus status, LocalDateTime orderDate) {
    this.user = user;
    this.delivery = delivery;
    this.status = status;
    this.orderDate = orderDate;
  }

  //--- 양방향 연관관계 편의 메서드 ------// 편의메서드는 컨트롤 하는 쪽에 만들어주면 됨
  // 다 쪽이  연관관계 주인으로 값 의 변경사항은 주인쪽에서 함
  // 다 쪽이 set // 일쪽이 add 

  public void setUser(User user) { 
    this.user = user;
    user.getOrders().add(this);
  }

  public void addOrderItem(OrderItem orderItem) {
    orderItems.add(orderItem);
    orderItem.setOrder(this);
  }

  public void SetDelivery(Delivery delivery) { 
    this.delivery = delivery;
    delivery.setOrder(this);
  }
}

중 public void SetDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } 에서 연관관계 주인은 order 이면 delivery.setOrder(this); 해도 변경사항이 데이터베이스에 반영이 안되는 것 아냐?

이것도 setUser() 와 동일하게

delivery.getOrder().add(this); 해야하는 거 아닌가요??

 

헷갈리는게 연관관계 주인쪽에서만 변경사항이 데이터베이스에 반영되는것으로 알고 있는데 이 말의 정확한 예시가 궁금합니다.

 

 

 

답변 1

0

안녕하세요. 빛혜원님, 공식 서포터즈 David입니다.

setUsers의 경우 다대일 관계인 User의 주문목록(Orders) Order를 추가하는 것입니다.

반면, setDelivery의 경우 일대일 관계인 Delivery의 주문(Order)에 Order를 할당하고 있습니다.

이는 다대일, 일대일에서 오는 차이이며, 일대일 관계에서는 한쪽이 목록(list)을 들고 있지 않습니다.

따라서, list(user.getOrders()의 반환값)에 추가하는 것이 아니라

field(delivery.setOrder()는 Delivery의 Order 필드에 값을 할당)에 할당하게 되는 것입니다.

 

연관관계 주인에 대한 자세한 내용은 아래 강의의 연관관계 매핑 기초 섹션에서 다루고 있으니 참고해 주세요.

https://www.inflearn.com/course/ORM-JPA-Basic

감사합니다.


빛혜원님의 프로필 이미지
빛혜원

작성한 질문수

질문하기