package hello.hellospring.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
@Column(name="name")
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
@Entity : 객체를 도메인 엔티티로 인식하게함
@Column : 객체 필드와 DB 테이블 컬럼을 매핑
-> (name = "") 속성 : 맵핑할 테이블의 컬럼 이름을 지정
Member 테이블
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
@Column(name="name")
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
@Embedded : 밸류 클래스라 칭함, 밸류 클래스란 int, double 처럼 하나의 값을 나타내는 클래스를 말합니다. 보통 주소(address)라는 값을 저장하기 위해서는 아래와 같이 String 변수에 저장하여 관리
@OneToMany() : 회원 1명은 여러개의 주문을 가질 수 있는 1 : N 관계이다. 이것을 JPA상의 어노테이션으로 표현하면 OneToMany()이다.
-> mappedBy속성 : 양방향 관계 설정시 주체가 되는 쪽에서 정의. 보통 상단 fk에 해당하는 컬럼에다 부여(좀 더 주체성이 있는)
package hello.hellospring.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Getter @Setter
public class OrderItem {
@Id @GeneratedValue
@Column (name = "order_item_id")
private Long id;
private Item item;
@ManyToOne
@JoinColumn(name = "order_id") //order_id는 Order테이블의 pk임
private Order order;
private int orderPrice; //주문 가격
private int count; //주문 수량
}
@JoinColumn : DB 관점으로 보았을 때, 본인이 외래 키를 관리하며 상대 Table의 PK(Join할 때)를 명시해주는 역할을 함
@GeneratedValue : pk의 값을 위한 자동 생성 전략을 명시하는데 사용함. 선택적 속성으로 generator와 strategy가 있다. strategy는 persistence provider가 엔티티의 주키를 생성할 때 사용해야 하는 pk생성 전략을 의미한다. default 값은 AUTO
generator는 SequenceGenerator나 TableGenerator 어노테이션에서 명시된 pk 생성자를 재사용할 때 쓰임. default값은 공백문자("")이다.
pk 생성 전략으로 JPA가 지원하는 것
package hello.hellospring.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "orders")
@Getter @Setter
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order") // 연관관계의 주인
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne
@JoinColumn(name= "delivery_id")
private Delivery delivery;
private LocalDateTime orderDate; //주문시간
@Enumerated(EnumType.STRING)
private OrderStatus status; // 주문상태 [ORDER, CANCEL]
}
@mappedBy
mappedBy 또한 특정 관계와의 연관관계를 나타낼 때 사용하는데, @ManyToOne과는 달리 연관관계의 주인이 아닌 쪽의 Class내에서 사용
보통 양방향 연관관계에서 사용
이해하는 법) 저는 상대 클래스와 연관된 클래스입니다. 관련은 있는데 저에 대한 외래키는 저 친구가 갖고 있어요.
그러므로 저는 연관관계의 주인이 아니랍니다. mappedBy붙은 저 친구가 연관관계 주인이에요
@Enumerated
자바의 enum 타입을 매핑할 때 사용
예시
enum RoleType {
ADMIN, USER
}
@Enumberated(EnumType.STRING)
private RoleType roleType;
enum에 정의된 순서대로, ADMIN은 0, USER는 1 값이 DB에 저장됨
장점 : 데이터의 크기가 작음
단점 : 이미 저장된 enum의 순서를 변경할 수 없음
enum 이름 그대로 ADMIN은 'ADMIN'으로 저장됨
장점 : 저장된 enum의 순서가 바뀌거나, enum이 추가되어도 안전함
단점 : DB에 저장되는 데이터 크기가 ORDINAL에 비해서 큼
EnumType.ORDINAL은 순서가 바뀌면 인식할 시 문제가 생길 수 있으므로 실질적으로 EnumType.STRING을 사용하는 것을 권장