연관 관계 매핑 : N대1, 1대N 양방향 매핑 > 스프링 부트

본문 바로가기

[개발] 연관 관계 매핑 : N대1, 1대N 양방향 매핑

필기자
2022-11-07 16:33 2,088 0

본문

member와 orders와의 관계 1:N

연관 관계에서 주인은 orders : orders가 FK를 가짐

 

20221107155806_b7e01d0501d844f992b5c6d5592b1e1a_k61e.png

 

kr/hull/shop/config/OrderStatus.java



public enum OrderStatus {
    ORDER, CANCEL
}

 

kr/hull/shop/entity/Order.java



@Entity
@Table(name = "orders") // sql 예약어 중 order 존재하여 orders로 테이블명 변경
@Getter
@Setter
public class Order{

    @Id
    @GeneratedValue
    @Column(name = "order_id")
    private Long id;

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

    private LocalDateTime orderDate; //주문일

    @Enumerated(EnumType.STRING)
    private OrderStatus orderStatus; //주문상태

    private LocalDateTime regTime;
    private LocalDateTime updateTime;
}

 

orders와 order_item와의 관계 1:N

연관 관계에서 주인은 order_item : order_item가 FK를 가짐

 

20221107160817_b7e01d0501d844f992b5c6d5592b1e1a_1xiu.png

 

kr/hull/shop/entity/OrderItem.java



@Entity
@Getter
@Setter
public class OrderItem{

    @Id
    @GeneratedValue
    @Column(name = "order_item_id")
    private Long id;

    @ManyToOne
    @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;

}

 

ORDERS와 ORDER_ITEM 테이블을 ORDER_ID를 외래키로 조인하면 주문에 속한 상품이 어떤상품들이 있는지 알 수 있고, 주문 상품은 어떤 주문에 속하는지를 알 수 있음
즉, 테이블은 외래키 하나로 양방향 조회가 가능. 하지만 엔티티를 양방향 연관 관계로 설정하면 객체의 참조는 둘인데 외래키는 하나이므로 둘 중 누가 외래키를 관리할지를 정해야함.

  1. 연관 관계의 주인은 외래키가 있는 곳으로 설정
  2. 연관 관계의 주인이 외래키를 관리(등록, 수정, 삭제)
  3. 주인이 아닌 쪽은 연관 관계 매핑 시 mappedBy 속성의 값으로 연관 관계의 주인을 설정
  4. 주인이 아닌 쪽은 읽기만 가능
     

양방향 연관 관계 추가

kr/hull/shop/entity/Order.java



@Entity
@Table(name = "orders") // sql 예약어 중 order 존재하여 orders로 테이블명 변경
@Getter
@Setter
public class Order{

    @Id
    @GeneratedValue
    @Column(name = "order_id")
    private Long id;

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

    private LocalDateTime orderDate; //주문일

    @Enumerated(EnumType.STRING)
    private OrderStatus orderStatus; //주문상태

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

    private LocalDateTime regTime;
    private LocalDateTime updateTime;
}

 

양방향 매핑은 사용자 편의성을 위해 제공되는 기능임

단방향 매핑으로 설계 후 시스템 사용자를 위한 확장 기능을 제공할 때 추가하는 형태

 

 

댓글목록0

등록된 댓글이 없습니다.
게시판 전체검색