오봉이와 함께하는 개발 블로그
JPA - 실전 예제 3 - 다양한 연관관계 매핑 본문
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