배송, 카테고리 추가 - 엔티티와 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
'Spring > JPA' 카테고리의 다른 글
Mapped Superclass - 매핑 정보 상속 / 상속관계 매핑 (0) | 2022.05.28 |
---|---|
고급매핑 - 상속관계 매핑 (0) | 2022.05.27 |
일대일 1:1 / 다대다 N:M (0) | 2022.05.25 |
다대일 N:1 / 일대다 1:N (0) | 2022.05.25 |
예제 - 연관관계 매핑 시작 (0) | 2022.05.25 |