다양한 연관관계 매핑 예제
주문과 배송
Orders, Delivery은 1:1 관계, order에서 delivery에 접근하기 위해서는 외래 키를 order에 둔다.
일대일 관계이기 때문에 orders 테이블에 있는 deliveryID는 유니크
상품과 카테고리
하나의 상품은 여러가지의 카테고리에 들어갈 수 있고 하나의 카테고리에서 여러가지의 상품이 들어가기 때문에 order : category = n : n
Category, Item은 양방향으로 다대다 관계라고 볼 수 있다.
@ManyToMany, @JoinTable - name, @JoinColumn, @InverseJoinColumn 을 사용해서 CategoryItem이라는 매핑 테이블을 통해서 매핑했다.
이 방법 이외에도 따로 테이블을 만들어서도 해보면 좋을 것 같다..! - 내일? 오늘? 해보자
Member
package com.example.jpa_project.ch06HW;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMEBR_ID")
private Long Id;
private String name;
private String city;
private String street;
private String zipCode;
}
Orders
package com.example.jpa_project.ch06HW;
import javax.persistence.*;
import java.util.Date;
@Entity
public class Order {
@Id
@GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
private Date orderDate;
@OneToOne
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery;
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
@Enumerated(EnumType.STRING)
private DeliveryStatus deliveryStatus;
}
OrderStatus
package com.example.jpa_project.ch06HW;
public enum DeliveryStatus {
READY, DONE
}
Delivery
package com.example.jpa_project.ch06HW;
import javax.persistence.*;
@Entity
public class Delivery {
@Id
@GeneratedValue
@Column(name = "DELIVERY_ID")
private Long id;
private String city;
private String street;
private String zipCode;
@Enumerated(EnumType.STRING)
private DeliveryStatus deliveryStatus;
@OneToOne(mappedBy = "ORDER_ID")
private Order order;
}
Category
package com.example.jpa_project.ch06HW;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class Category {
@Id
@GeneratedValue
@Column(name = "CATEGORY_ID")
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "PARENT_ID")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> categoryList = new ArrayList<>();
@ManyToMany
@JoinTable(
name = "CATEGORY_ITEM",
joinColumns = @JoinColumn(name = "CATEGORY_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_ID")
)
private List<Item> items = new ArrayList<>();
}
Item
package com.example.jpa_project.ch06HW;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class Item {
@Id
@GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int amount;
private int stockQuantity;
@ManyToMany(mappedBy = "items")
private List<Category> categories = new ArrayList<>();
}