이러한 구조의 테이블을 구성하고자 한다.
어떻게 해야 할까?
package com.codingbox.jpashop.domain;
import java.util.ArrayList;
import java.util.List;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter @Setter
public class Member {
@Id // 키 값을 id로 설정
@GeneratedValue //전략 생략하면 AUTO로 세팅
@Column(name = "MEMBER_ID")//DB입장
private Long id; // 객체 입장
private String name;
private String city;
private String street;
private String zipcode;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
public void addOrder(Order order) {
order.setMember(this);
this.orders.add(order);
}
}
mappedBy를 통해 종속관계에 있다는 것을 알 수 있다.
addOrder메서드는 Order 객체를 Member 객체와 연결하고, Member 객체의 orders 리스트에 해당 Order 객체를 추가하는 역할을 한다.
package com.codingbox.jpashop.domain;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
//@Entity
@Getter @Setter
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue //전략 생략했기 때문에 auto로 세팅
@Column(name="ORDER_ID")
private Long id;
@ManyToOne
@JoinColumn(name="MEMBER_ID")
//private Long memberId;
private Member member;
private LocalDateTime orderDate;
private String status;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderitems = new ArrayList<>();
public void addOrderItem(OrderItem orderitem) {
orderitem.setOrder(this);
this.orderitems.add(orderitem);
}
}
주 관계와 종속 관계를 둘 다 가지고 있다. Member테이블과 비교하면 주 관계이지만, addorderitem테이블과 비교하면 종속이다. 아무튼 member테이블과 놓고 보자면
@JoinColumn(name="MEMBER_ID")
private Member member; 이 부분을 이용해 MEMBER_ID를 fk값으로 가져온다.
package com.codingbox.jpashop.domain;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.Setter;
//@Entity
@Getter @Setter
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "ORDER_ITEM_ID")
private Long id;
// @Column(name="ORDER_ID")
//
// private Long orderId; //이 방법 안쓰고
// @Column(name="ITEM_ID")
// private Long itemId;
@ManyToOne
@JoinColumn(name="ORDER_ID")
private Order order; //이 방법으로
@ManyToOne
@JoinColumn(name="ITEM_ID")
private Item item;
private int orderPrice;
private int count;
}
외래키를 item에서 하나, order에서 하나 가져온다. 종속되는 부분이 없기에 mappedBy는 사용되지 않는다. 외래키를 받는 방법에 대해 좀 자세히 보자.
@Column(name="ORDER_ID")
private Long orderId; 기존엔 이러한 방식으로 외래키를 가져왔다면
@ManyToOne
@JoinColumn(name="ORDER_ID")
private Order order; 이젠 이런식으로 가져온다.
✍️두 방법의 차이는 무엇일까?
@JoinColumn는 엔티티 간의 관계를 설정할 때 사용된다는 점에서 차이가 있다. 주로 양방향 관계에서 사용되며, 부모 엔티티와 자식 엔티티 간의 관계를 정의하고 어떤 열(외래 키)을 사용하여 이 관계를 구성할 것인지를 지정한다.
결국 양방향 관계를 설정하면서 @JoinColumn 어노테이션을 사용하였고 엔티티 간의 관계를 정의한다.
package com.codingbox.jpashop.domain;
import java.util.ArrayList;
import java.util.List;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import lombok.Getter;
import lombok.Setter;
//@Entity
@Getter @Setter
public class Item {
@Id
@GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
@OneToMany(mappedBy = "item")
private List<OrderItem> orderitems = new ArrayList<>();
public void addOrderItem(OrderItem orderitem) {
orderitem.setItem(this);
this.orderitems.add(orderitem);
}
}
⭐크게 특이 사항은 없다.종속 관계라는점과
pk값으로 ITEM_ID을 가지고 addOrderItem 메서드에서
orderitem.setItem(this)는 OrderItem 객체의 item 필드를 현재 Item 객체(this)로 설정하는 역할을 한다