Spring/JPA

실전 예제 3 - 다양한 연관관계 매핑

느리지만 꾸준하게 2022. 5. 25. 17:43

배송, 카테고리 추가 - 엔티티와 ERD를 보자.

 

 

Delivery 및 Category Class를 만들어주자.

package jpabook.jpashop.domain;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Delivery {

    @Id
    @GeneratedValue
    private Long id;

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

Order와 Delivery의 관계를 1대1로 잡아준다. 

먼저 Order 설정

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

 

양방향 설정을 원하면 Delivery Class에서 아래와 같이 해준다.

@Entity
public class Delivery {

    @Id
    @GeneratedValue
    private Long id;

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

    @OneToOne(mappedBy = "delivery")
    private Order order;
}

 

 

 

Category Class도 세팅을 해준다.

package jpabook.jpashop.domain;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

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

 

 

item과의 다대다 관계는 아래와 같다.

Category에서 설정해주고 

@ManyToMany
@JoinTable(name = "CATEGORY_ITEM",
        joinColumns = @JoinColumn(name = "CATEGORY_ID"),
        inverseJoinColumns = @JoinColumn(name = "ITEM_ID")
)
private List<Item> items = new ArrayList<>();

 

item Class도 설정을 해준다.

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

 

실행창을 보면 Category와 Delivery가 잘 들어가 있다.

Orders 안에도 delivery_id가 들어가 있다.

Hibernate: 
    
    create table Category (
       id bigint not null,
        name varchar(255),
        PARENT_ID bigint,
        primary key (id)
    )
    
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)
    )

 

 

@joincolumn에서 매핑할 외래 키 이름 name과 referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명을 참조해주자.

 

아래 속성에서 Many to one은 연관관계의 주인이 되어야 한다.

왜냐 OneToMany는 mappedBy가 있고 Many to one은 없기 때문이다.

 

 

 

 

 

<출처 김영한: 자바 ORM 표준 JPA 프로그래밍 - 기본편 >

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com