관리 메뉴

샐님은 개발중

#4. 연관 관계 매핑 본문

포토폴리오/Spring-Boot,JPA - 쇼핑몰사이트 v2

#4. 연관 관계 매핑

샐님 2023. 8. 4. 00:38
728x90
반응형

연관관계 매핑 종류

1. 일대일 : @OneToOne

2. 일대다 : @OneToMany

3. 다대일 : @ManyToOne

4. 다대다 : @ManyToMany

 

1. 일대일 단반향 매핑

장바구니 -회원 엔티티 관계는 장바구니가 일대일로 회원을 매핑한다. 

1) Cart 엔티티 생성

package won.shop.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class Cart {
    @Id
    @GeneratedValue
    @Column(name="cart_id")
    private long id;

    @OneToOne
    @JoinColumn(name="member_id") // name 에는 조인할 외래키를 입력
    private Member member;
}

Member 엔티티에는 cart를 참조하지 않으므로 cart의 일방적으로 회원 엔티티를 참조하는 일대일 단반향 매핑.

2) CartRepository 생성

package won.shop.Repository;

import org.springframework.data.jpa.repository.JpaRepository;
import won.shop.domain.Cart;

public interface CartRepositroy extends JpaRepository<Cart,Long> {

}

2. 다대일 단반향 매핑

 - 하나의 장바구니에 여러 상품이 들어갈수 있다. 또한 같은 상품을 여러개 주문가능하다. 

 

1) cart_tem 엔티티 생성

package won.shop.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class Cart_item {
    @Id
    @GeneratedValue
    @Column(name="cart_item_id")
    private Long id;
    @ManyToOne
    @JoinColumn(name="cart_id") // 다대일 단방향 매핑
    private Cart cart;
    @OneToOne
    @JoinColumn(name="item_id")
    private Item item;
    private int count;

}

3. 다대일/일대다 양방향 매핑

- 양반향 매핑이란 단방향 매핑이 2개 있다고 생각하면 된다. 

* 주문 - 주문 상품 

1) 주문 엔티티 생성

package won.shop.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.thymeleaf.extras.springsecurity6.util.SpringSecurityContextUtils;
import won.shop.constant.OrderStatus;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
@Entity
@Table(name="orders")
public class Order {
    @Id
    @GeneratedValue
    @Column(name="order_id")
    private Long id;
    @ManyToOne
    @JoinColumn(name="member_id")
    private Member member;
    @OneToMany(mappedBy = "order")// 연관관계주인은 orderitem 엔티티이고 mappedBy="order" 인 이유는 OrderItem 에 있는 Order 필드가 연관 주인으로 설정되어있기 때문
    private List<OrderItem> orderItems = new ArrayList<>();
    private LocalDateTime orderDate;
    private OrderStatus orderStatus;
    private LocalDateTime regTime;
    private LocalDateTime updateTime;

}

2) 주문상품 엔티티 생성

package won.shop.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
@Entity
public class OrderItem {
    @Id
    @GeneratedValue
    @Column(name="order_item_id")
    private Long id;
    @OneToOne
    @JoinColumn(name="item_id")
    private Item item;
    @ManyToOne
    @JoinColumn(name="order_id")
    private Order order;

    private int orderPrice;
    private int count;
    private LocalDateTime regTime;
    private LocalDateTime updateTime;
}

 

728x90
반응형