오봉이와 함께하는 개발 블로그

JPA - 실전 예제 3 - 다양한 연관관계 매핑 본문

BE/JPA

JPA - 실전 예제 3 - 다양한 연관관계 매핑

오봉봉이 2022. 6. 27. 02:29
728x90

다양한 연관관계 매핑

  • 주문과 배송은 1:1 (@OneToOne)
  • 상품과 카테고리는 N:M (@ManyToMany)

엔티티

ERD

엔티티 상세

기존 코드

https://5bong2-develop.tistory.com/223

변경 코드

  • DeliveryStatus는 enum으로 만들기만 했다.

Member

@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "MEMBER_ID")
    private Long id;

    private String name;
    private String city;
    private String street;
    private String zipcode;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

Order

@Entity
@Table(name = "ORDERS")
@Getter
@Setter
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ORDER_ID")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "MEMBER_ID")
    private Member member;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

    @OneToMany(mappedBy = "order")
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne
    @JoinColumn(name = "DELIVERY_ID")
    private Delivery delivery;
}

Item

@Entity
@Getter
@Setter
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @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<>();
}

OrderItem

@Entity
public class OrderItem {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ORDER_ITEM_ID")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "ORDER_ID")
    private Order order;

    @ManyToOne
    @JoinColumn(name = "ITEM_ID")
    private Item item;

    private int orderPrice;
    private int count;
}

Category

@Entity
@Getter
@Setter
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> child = new ArrayList<>();

    @ManyToMany
    @JoinTable(name = "CATEGORY_ITEM", // 중간 테이블 매핑 작업
                joinColumns = @JoinColumn(name = "CATEGORY_ID"), // Category가 Join하는 컬럼 명시
                inverseJoinColumns = @JoinColumn(name = "ITEM_ID") // Item이 Join하는 컬럼 명시
    )
    private List<Item> items = new ArrayList<>();
}

Delivery

@Entity
@Getter
@Setter
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 관계는 1:N, N:1로

  • 테이블의 N:M 관계는 중간 테이블을 이용해서 1:N, N:1 구조로 바꿔야 함.
  • 실무에서는 중간 테이블이 저렇게 단순하지 않음.
  • @ManyToMany 제약
    • 필드 추가 불가
    • 엔티티 테이블 불일치
  • 실전에서는 @ManyToMany 사용 XXX

@JoinColumn - 주요 속성

  • referencedColumnName
    • 외래키가 참조하는 대상 테이블의 컬럼명이 달라질 때 사용

@ManyToOne - 주요 속성

  • N:1 관계 매핑
  • fetch
    • 즉시 로딩
    • 지연 로딩
  • @ManyToOne에서는 mappedBy 속성이 없다
    • 꼭 연관관계의 주인이 되어야 하기 때문

@OneToMany - 주요 속성

mappedBy
// Order 엔티티
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;
// OrderItem 엔티티
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
  • N:1 관계 매핑
  • fetch
    • 즉시 로딩
    • 지연 로딩
출처 : 인프런 김영한 지식공유자님의 스프링 부트와 JPA 실무 완전 정복 로드맵 강의
728x90

'BE > JPA' 카테고리의 다른 글

JPA - @Mapped Superclass  (0) 2022.06.28
JPA - 상속관계 매핑  (0) 2022.06.28
JPA - 연관관계 매핑 1:1, N:M  (0) 2022.06.27
JPA - 연관관계 매핑 N:1, 1:N  (0) 2022.06.26
JPA - 실전 예제 2 - 연관관계 매핑  (0) 2022.06.25
Comments