본문 바로가기
Dev/JPA

[JPA] 실습 - 다양한 연관관계 매핑

by dev_jsk 2021. 8. 23.
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<>();
}

동작 결과

상품 - 카테고리 관계 생성, 다대다 관계이기 때문에 연결 테이블(CATEGORY_ITEM) 생성

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

댓글