객체와 테이블은 차이가 있다.
객체는 연관관계가 있는 두 군데(1쪽과 N쪽)에 모두 참조할 수 있는 객체가 존재해야만 서로를 참조할 수 있고,
테이블은 한 군데(N쪽)에 외래키 하나만으로 두 객체가 서로 참조(심지어 역참조도)할 수 있다.
그래서, 테이블 관점으로 보면, 한 곳(N쪽 : OrderItem)에만 외래키가 있기 때문에,
객체에서도 한 곳(N쪽 : OrderItem)에서 참조값을 넣어주면, 당연히 들어가겠지라고 생각을 할 수 있다.
하지만, 객체에서는 두 군데(1쪽: Order & N쪽: OrderItem)에 다 참조값을 넣어줘야만 참조가 가능하다. 각각 @ManyToOne 어노테이션과 @OneToMany 어노테이션이 서로 참조하기 위한 것이다.
연관관계 매핑이 끝났다면 참조와 역참조가 가능하도록 메서드를 만들어주는데 이를 연관관계 편의 메소드라고 부른다.
그리고 두 군데(1쪽: Order & N쪽: OrderItem)에서 객체들의 연관관계 매핑이 끝났다면 참조와 역참조가 가능하도록 메서드를 만들어주는데 이를 연관관계 편의 메소드라고 부른다. 이 때, 하나의 클래스를 정해서 이 곳에서만 연관관계 편의 메소드를 만드는데, 연관관계 편의 메소드는 주로 접근하는 도메인을 고려하여 만들어준다.
// 1쪽 : Order
@Entity
@Table(name = "orders")
@Getter @Setter
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);
}
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery) {
this.delivery = delivery;
delivery.setOrder(this);
}
}
// N쪽 : OrderItem
@Entity
@Table(name = "order_item")
@Getter @Setter
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "order_item_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item; //주문 상품
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order; //주문
private int orderPrice; //주문 가격
private int count; //주문 수량
}
객체와 테이블은 차이가 있다. 객체는 연관관계가 있는 두 군데(1쪽과 N쪽)에 모두 참조할 수 있는 객체가 존재해야만 서로를 참조할 수 있고, 테이블은 한 군데(N쪽)에 외래키 하나만으로 두 객체가 서로 참조(심지어 역참조도)할 수 있다.
그래서, 테이블 관점으로 보면, 한 곳(N쪽 : OrderItem)에만 외래키가 있기 때문에, 객체에서도 한 곳(N쪽 : OrderItem)에서 참조값을 넣어주면, 당연히 들어가겠지라고 생각을 할 수 있다. 하지만, 객체에서는 두 군데(1쪽: Order & N쪽: OrderItem)에 다 참조값을 넣어줘야만 참조가 가능하다. 각각 @ManyToOne 어노테이션과 @OneToMany 어노테이션이 서로 참조하기 위한 것이다.
연관관계 매핑이 끝났다면 참조와 역참조가 가능하도록 메서드를 만들어주는데 이를 연관관계 편의 메소드라고 부른다. 그리고 두 군데(1쪽: Order & N쪽: OrderItem)에서 객체들의 연관관계 매핑이 끝났다면 참조와 역참조가 가능하도록 메서드를 만들어주는데 이를 연관관계 편의 메소드라고 부른다. 이 때, 하나의 클래스를 정해서 이 곳에서만 연관관계 편의 메소드를 만드는데, 연관관계 편의 메소드는 주로 접근하는 도메인을 고려하여 만들어준다.