배송, 카테고리 추가 - 엔티티
- 주문과 배송은 1:1(@OneToMany)
- 상품과 카테고리는 N:M(@ManyToMany)
배송, 카테고리 추가 - ERD
주문과 배송 1:1관계
Order가 연관관계의 주인인 관계
@Entity
@Table(name = "ORDERS") //ORDERS는 ORDER BY라는 명령어가 있기 떄문에 S를 붙여준다
public class Order {
@Id
@GeneratedValue
@Column(name="ORDER_ID")
private long id;
@ManyToOne
@JoinColumn(name="MEMBER_ID")
private Member member;
@OneToOne
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
private LocalDateTime orderDateTime;
@Enumerated(EnumType.STRING)
private OrderStatus status;
}
@Entity
public class Delivery {
@Id
@GeneratedValue
@Column(name = "DELIVERY_ID")
private Long id;
private String city;
private String street;
private String zipcode;
private DeliveryStatus status;
@OneToOne(mappedBy = "delivery")
private Order order;
}
상품과 카테고리 N:M관계
카테고리가 연관관계의 주인인 관계
@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;
@ManyToMany
@JoinTable(name="CATEGORY_ITEM"
, joinColumns = @JoinColumn(name="CATEGORY_ID")
, 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;
@ManyToMany(mappedBy = "items")
private List<Category> categories = new ArrayList<>();
}
N:M관계
- 테이블의 N:M 관계는 중간 테이블을 이용해서 1:N, N:1
- 실전에서는 중간 테이블이 단순하지 않다
- @ManyToMany는 제약: 필드 추가X, 엔티티 테이블 불일치
- 실전에서는 @ManyToMany 사용 하지 않는다