728x90
반응형
이전 실습에 배송, 카테고리 관계를 추가해보자.
엔티티 구성
- 주문과 배송은
1:1
(@OneToOne
) - 상품과 카테고리는
N:M
(@ManyToMany
)
테이블 및 엔티티 설계
실습
주문 - 배송
소스
- Order.java
@Entity
@Table(name = "ORDERS")
public class Order {
@Id @GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
// 일대일 양방향 (Order <-> Delivery)
@OneToOne
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem);
orderItem.setOrder(this);
}
// getter, setter
}
- Delivery.java
@Entity
public class Delivery {
@Id @GeneratedValue
private Long id;
private String city;
private String street;
private String zipcode;
private DeliveryStatus status;
// 일대일 양방향 (Order <-> Delivery)
@OneToOne(mappedBy = "delivery")
private Order order;
// getter, setter
}
- DeliveryStatus.java
public enum DeliveryStatus {}
동작 결과
상품 - 카테고리
소스
- Item.java
@Entity
public class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
// 다대다 양방향 (Category <-> Item)
@ManyToMany(mappedBy = "items")
private List<Category> categories = new ArrayList<>();
// getter, setter
}
- Category.java
@Entity
public class Category {
@Id @GeneratedValue
private Long id;
private String name;
// 부모-자식 관계
// 양방향으로 구성 (parent <-> child)
// parent
@ManyToOne
@JoinColumn(name = "PARENT_ID")
private Category parent;
// child
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
// 다대다 (Item <-> Category)
@ManyToMany
@JoinTable(name = "CATEGORY_ITEM",
joinColumns = @JoinColumn(name = "CATEGORY_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_ID")
)
private List<Item> items = new ArrayList<>();
}
동작 결과
N:M 관계는 1:N, N:1로 변경
- 테이블의
N:M
관계는 중간 테이블을 이용해서1:N
,N:1
관계로 변경 - 실전에서는 중간 테이블이 단순하지 않다. (= 연결정보만 있는 것이 아니다.)
@ManyToMany
는 필드 추가 불가능하고 엔티티 테이블 불일치한다는 제약이 있다.- 실무에서는
@ManyToMany
사용하지 않는다.
728x90
반응형
'Dev > JPA' 카테고리의 다른 글
[JPA] 실습 - 상속관계 매핑 (0) | 2021.08.25 |
---|---|
[JPA] 고급 매핑 (0) | 2021.08.24 |
[JPA] 다양한 연관관계 매핑 (0) | 2021.08.23 |
[JPA] 실습 - 연관관계 매핑 시작 (0) | 2021.08.18 |
[JPA] 연관관계 매핑 기초 (0) | 2021.08.12 |
댓글