Entity
들 간의 연관 관계를 매핑
프로젝트를 위해 공부를 하면서 연관 관계 매핑에는 총 4가지의 매핑 관계가 있다는 것을 알게 되었다.
@OneToOne
@OneToMany
@ManyToOne
@ManyToMany
또한, 방향성도 존재하는데 단방향
(한쪽에서 다른 한쪽) 과 양방향
이 있다.
장바구니 기능을 추가하면서 장바구니는 회원과 일대일 단방향 관계임을 알게 되었다. 이러한 연관관계를 토대로 Entity를 설계하였다.
Cart.java
package com.shop.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
@Entity
@Table(name = "cart")
@Getter @Setter
@ToString
public class Cart {
@Id
@Column(name = "cart_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@JoinColumn(name="member_id")
private Member member;
}
@OneToOne
을 이용. 회원 엔티티와 일대일 매핑@JoinColumn
어노테이션을 통해 매핑할 외래키 지정
Cart
Entity ➡️Member
Entity
장바구니 엔티티가 회원 엔티티를 참조하는 일대일 단방향 매핑
CartItem.java
package com.shop.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Getter
@Setter
@Table(name="cart_item")
public class CartItem {
@Id
@GeneratedValue
@Column(name = "cart_item_id")
private Long id;
@ManyToOne // 1.
@JoinColumn(name = "cart_id")
private Cart cart;
@ManyToOne // 2.
@JoinColumn(name = "item_id")
private Item item;
private int count;
}
@ManyToOne
다대일 매핑@ManyToOne
다대일 매핑먼저, 주문 상태를 나타내는 OrderStatus
enum class를 만들었다. 주문을 한 상태는 Order
, 취소상태는 Cancel
2가지로 나타내었다.
OrderStatus.java
package com.shop.constant;
public enum OrderStatus {
ORDER, CANCEL
}
Order.java
package com.shop.entity;
import com.shop.constant.OrderStatus;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "orders") // 1.
@Getter
@Setter
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne // 2.
@JoinColumn(name = "member_id")
private Member member;
private LocalDateTime orderDate; // 주문일
@Enumerated(EnumType.STRING)
private OrderStatus orderStatus; // 주문 상태
@OneToMany(mappedBy = "order") // 3.
private List<OrderItem> orderItems = new ArrayList<>()
// 4.
private LocalDateTime regTime;
private LocalDateTime updateTime;
Order
Entity에 매핑되는 테이블로 "Orders" 를 지정 (정렬할 때 사용하는 "order" 키워드가 이미 있기 때문Order Entity
가 주인이 아니기 때문에 "mappedBy" 속성으로 연관 관계의 주인을 설정OrderItem.java
package com.shop.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Getter
@Setter
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "order_item_id")
private Long id;
@ManyToOne
@JoinColumn(name = "item_id")
private Item item; // 1.
@ManyToOne
@JoinColumn(name = "order_id")
private Order order; // 2.
private int orderPrice; // 주문 가격
private int count;
private LocalDateTime regTime;
private LocalDateTime updateTime;