member, order, delivery 관계에서 FK는 주 테이블인 orders에 넣는다. category와 item은 다대다 관계에서 중간 테이블을 둔다. 여기서는 연습용으로 @ManyToMany를 사용한다.
Entity 상세
category와 item은 다대다 관계이지만 중간 테이블을 만들지 않았다.
연관 관계 구현
@Entity
public class Delivery {
@Id
@GeneratedValue
private Long id;
private String city;
private String street;
private String zipcode;
private DeliveryStatus status;
@OneToOne(mappedBy = "delivery")
private Order order;
}
@Entity
public class Category {
@Id
@GeneratedValue
private Long id;
private String name;
// 자기 자신을 매핑하는 것도 가능하다.
@ManyToOne
// 상위 카테고리가 연관 관계의 주인
@JoinColumn(name = "PARENT_ID")
private Category parent;
// 각각의 상위 카테고리에 매핑 된 하위 카테고리
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
@ManyToMany
// 중간 테이블을 만들어준다.
@JoinTable(
// 중간 테이블 이름
name = "CATEGORY_ITEM",
// 한 쪽이 join 하는 것
joinColumns = @JoinColumn(name = "CATEGORY_ID"),
// 반대쪽이 join 하는 것
inverseJoinColumns = @JoinColumn(name = "ITEM_ID")
)
private List<Item> items = new ArrayList<>();
}
@Entity
public class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private int stockQuantity;
// Category.items가 연관 관계의 주인이다.
@ManyToMany(mappedBy = "items")
private List<Category> categories = new ArrayList<>();
}
@Entity
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@OneToOne
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery;
}
예제에서는 item과 category 사이에 @ManyToMany를 썼지만 실전에서는 사용하지 않는다.
중간 테이블을 이용해 일대다, 다대일로 풀어낸다.
실전에서는 중간 테이블이 단순하지 않기 때문이다.
필드를 추가할 수도 없고 엔티티와 테이블이 일치하지 않아 제약이 많다.
@JoinColumn
외래 키를 매핑할 때 사용한다.
외래 키가 참조하는 대상 테이블의 칼럼명이 다를 때는 referencedColumnName을 사용해 지정해준다.