연관관계 매핑 시작
- 엔티티 매핑 - 실전 예제에서는 외래 키를 그대로 가져오는 문제가 있었으므로,
엔티티에서 외래 키로 사용한 필드는 제거하고 참조를 사용하도록 변경
즉, 객체 관계를 외래 키를 직접 사용하는 것에서 참조를 사용하도록 변경
일대다, 다대일 연관관계 매핑
@Entity
public class Member { // 회원 엔티티
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
// 연관관계의 주인이 아닌 Member.orders에 @mappedBy 선언을 하여 연관관계의 주인인 member (Order.member 필드) 지정
@OneToMany(mappedBy = "member") // 회원과 주문은 일대다 양방향 관계
private List<Order> orders = new ArrayList<Order>(); // (Member -> Order로 참조하는 Member.orders 필드)
// Getter, Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
}
@Entity
@Table(name = "ORDERS")
public class Order { // 주문 엔티티
@Id @GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
// 외래 키가 있는 Order.member가 연관관계의 주인
@ManyToOne // 주문과 회원은 다대일 양방향 관계
@JoinColumn(name = "MEMBER_ID")
private Member member; // 주문 회원 (Order -> Member로 참조하는 Order.member 필드)
// 연관관계의 주인이 아닌 Order.orderItems에 @mappedBy 선언을 하여 연관관계의 주인인 order (OrderItem.order 필드) 지정
@OneToMany(mappedBy = "order") // 주문과 주문상품은 일대다 양방향 관계
private List<OrderItem> orderItems = new ArrayList<OrderItem>();
@Temporal(TemporalType.TIMESTAMP)
private Date orderDate; // 주문시간
@Enumerated(EnumType.STRING)
private OrderStatus status; // 주문상태
// ==연관관계 메서드 (연관관계 편의 메소드)== //
public void setMember(Member member) { // member -> order, order -> member
// 기존 관계 제거
if (this.member != null) {
this.member.getOrders().remove(this);
}
this.member = member; // == orders.setMember(member);
member.getOrders().add(this); // == member.getOrders().add(order);
}
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem);
orderItem.setOrder(this);
}
// Getter, Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Member getMember() {
return member;
}
public List<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(List<OrderItem> orderItems) {
this.orderItems = orderItems;
}
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
public OrderStatus getStatus() {
return status;
}
public void setStatus(OrderStatus status) {
this.status = status;
}
@Override
public String toString() {
return "Order{" +
"id=" + id +
", orderDate=" + orderDate +
", status=" + status +
'}';
}
}
public enum OrderStatus {
ORDER, CANCEL
}
@Entity
@Table(name = "ORDER_ITEM")
public class OrderItem { // 주문상품 엔티티
@Id @GeneratedValue
@Column(name = "ORDER_ITEM_ID")
private Long id;
@ManyToOne // 주문상품과 상품은 다대일 단방향 관계 (상품에서 주문상품을 참조할 일이 거의 없으므로)
@JoinColumn(name = "ITEM_ID")
private Item item; // 주문 상품 (OrderItem -> Item로 참조하는 OrderITem.item 필드)
// 외래 키가 있는 OrderItem.order가 연관관계의 주인
@ManyToOne // 주문상품과 주문은 다대일 양방향 관계
@JoinColumn(name = "ORDER_ID")
private Order order; // 주문
private int orderPrice; // 주문 가격
private int count; // 주문 수량
// Getter, Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public int getOrderPrice() {
return orderPrice;
}
public void setOrderPrice(int orderPrice) {
this.orderPrice = orderPrice;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public String toString() {
return "OrderItem{" +
"id=" + id +
", buyPrice=" + orderPrice +
", count=" + count +
'}';
}
}
@Entity
public class Item { // 상품 엔티티
@Id
@GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name; // 이름
private int price; // 가격
private int stockQuantity; // 재고수량
// Getter, Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getStockQuantity() {
return stockQuantity;
}
public void setStockQuantity(int stockQuantity) {
this.stockQuantity = stockQuantity;
}
@Override
public String toString() {
return "Item{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
객체그래프 탐색
- 이제 객체에서 참조를 사용할 수 있으므로, 객체 그래프를 탐색할 수 있고, JPQL에서도 사용할 수 있음
- 예 1) 주문한 회원을 객체 그래프로 탐색
Order order = em.find(Order.class, orderId);
Member member = order.getMember(); // 주문한 회원, 참조 사용
- 예 2) 주문한 상품 하나를 객체 그래프로 탐색
Order order = em.find(Order.class, orderId);
orderItem = order.getOrderItem().get(0);
Item = orderItem.getItem();
'Java-Spring > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 다양한 연관관계 매핑 - 실전 예제 (0) | 2022.04.04 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 다양한 연관관계 매핑 (0) | 2022.04.04 |
[자바 ORM 표준 JPA 프로그래밍] 연관관계 매핑 기초 (0) | 2022.03.29 |
[자바 ORM 표준 JPA 프로그래밍] 엔티티 매핑 - 실전 예제 (0) | 2022.03.26 |
[자바 ORM 표준 JPA 프로그래밍] 엔티티 매핑 (0) | 2022.03.23 |