코드 그라데이션

실습 3 - 다양한 연관관계 매핑 본문

Spring/JPA 공부

실습 3 - 다양한 연관관계 매핑

완벽한 장면 2023. 8. 22. 10:14

배송, 카테고리 추가 - 엔티티

 

 

배송, 카테고리 추가 - 엔티티

 

배송 카테고리 추가 - 엔티티 상세내용

 

코드변경

새로생긴

Category

@Entity
@NoArgsConstructor
public class Category {

  @Id
  @GeneratedValue
  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"), // 내가 조인하는 애
      inverseJoinColumns = @JoinColumn(name = "ITEM_ID")) // 반대쪽이 조인하는 애
  private List<Item> items = new ArrayList<>();
}

 

 

Category와 연관관계 매핑한

Item

  // 여기도 양방향 만들어주려면
  @ManyToMany(mappedBy = "items")
  private List<Category> categories = new ArrayList<>();

이 코드 필드에 추가

 

 

새로생긴

Delivery

@Entity
@NoArgsConstructor
public class Delivery {

  @Id
  @GeneratedValue
  private Long id;

  private String city;
  private String street;
  private String zipcode;
  private DeliveryStatus status;

  // 양방향으로 Order하고 하고 싶으면
  @OneToOne(mappedBy = "delivery")
  private Order order;
}

아직은 껍데기인 Enum DeliveryStatus도 생성

 

 

Delivery와 연관관계 맺을 Order에 필드추가

Order

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

 

실행해서

중요한 것만 보면

 

Hibernate: 
    
    create table Category (
       id bigint not null,
        name varchar(255),
        PARENT_ID bigint,
        primary key (id)
    )

Hibernate: 
    
    create table CATEGORY_ITEM (
       CATEGORY_ID bigint not null,
        ITEM_ID bigint not null
    )

Hibernate: 
    
    create table Delivery (
       id bigint not null,
        city varchar(255),
        status integer,
        street varchar(255),
        zipcode varchar(255),
        primary key (id)
    )

 

Hibernate: 
    
    create table ORDERS (
       ORDER_ID bigint not null,
        orderDate timestamp,
        status varchar(255),
        DELIVERY_ID bigint,
        MEMBER_ID bigint,
        primary key (ORDER_ID)
    )

 


현재까지 있는 코드들 정리해서 전체 보기

 

Category

@Entity
@NoArgsConstructor
public class Category {

  @Id
  @GeneratedValue
  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"), // 내가 조인하는 애
      inverseJoinColumns = @JoinColumn(name = "ITEM_ID")) // 반대쪽이 조인하는 애
  private List<Item> items = new ArrayList<>();
}

 

Delivery

@Entity
@NoArgsConstructor
public class Delivery {

  @Id
  @GeneratedValue
  private Long id;

  private String city;
  private String street;
  private String zipcode;
  private DeliveryStatus status;

  // 양방향으로 Order하고 하고 싶으면
  @OneToOne(mappedBy = "delivery")
  private Order order;
}

 

DeliveryStatus

 아직 껍데기

public enum DeliveryStatus {
  PENDING, // 주문이나 배송 요청이 접수되었지만 아직 처리 중인 상태.
  CONFIRMED, // 주문 또는 배송 요청이 확인되었으며 처리가 시작되었지만 아직 완료되지 않은 상태.
  INTRANSIT, // 상품이 배송 중인 상태.
  DELIVERD,// 상품이 성공적으로 배달되어 완료된 상태.
  CANCELED // 주문이나 배송 요청이 취소된 상태.
}

 

Item

@Entity
public class Item {

  @Id
  @GeneratedValue
  @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<>();

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getPrice() {
    return price;
  }

  public void setPrice(int price) {
    this.price = price;
  }

  public int getStockQuantity() {
    return stockQuantity;
  }

  public void setStockQuantity(int stockQuantity) {
    this.stockQuantity = stockQuantity;
  }
}

 

Member

@Entity
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<>();

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getCity() {
    return city;
  }

  public void setCity(String city) {
    this.city = city;
  }

  public String getStreet() {
    return street;
  }

  public void setStreet(String street) {
    this.street = street;
  }

  public String getZipcode() {
    return zipcode;
  }

  public void setZipcode(String zipcode) {
    this.zipcode = zipcode;
  }
}

 

 

Order

@Entity
@Table(name = "ORDERS")
public class Order {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "ORDER_ID")
  private Long id;

  @ManyToOne
  @JoinColumn(name = "MEMBER_ID")
  private Member member; // 이렇게 바꿔준다.

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

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



  private LocalDateTime orderDate;

  @Enumerated(EnumType.STRING)
  private OrderStatus status;


  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }


  public Member getMember() {
    return member;
  }

  public void setMember(Member member) {
    this.member = member;
  }

  public LocalDateTime getOrderDate() {
    return orderDate;
  }

  public void setOrderDate(LocalDateTime orderDate) {
    this.orderDate = orderDate;
  }

  public OrderStatus getStatus() {
    return status;
  }

  public void setStatus(OrderStatus status) {
    this.status = status;
  }

  public void addOrderItem(OrderItem orderItem) {
    orderItems.add(orderItem);
    orderItem.setOrder(this);
  }
}

 

 

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;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public Order getOrder() {
    return order;
  }

  public void setOrder(Order order) {
    this.order = order;
  }

  public Item getItem() {
    return item;
  }

  public void setItem(Item item) {
    this.item = item;
  }

  public int getOrderPrice() {
    return orderPrice;
  }

  public void setOrderPrice(int orderPrice) {
    this.orderPrice = orderPrice;
  }

  public int getCount() {
    return count;
  }

  public void setCount(int count) {
    this.count = count;
  }
}

 

OrderStatus

public enum OrderStatus {
  ORDER, CANCEL
}
728x90

'Spring > JPA 공부' 카테고리의 다른 글

@MappedSuperclass  (0) 2023.08.23
상속관계 매핑  (0) 2023.08.23
다대다 [N : N]  (0) 2023.08.21
일대일 [1 : 1]  (0) 2023.08.21
일대다 [1 : N]  (0) 2023.08.20
Comments