@Entity : 엔티티 이름
@Table : 엔티티와 매핑할 테이블 지정
@Id로 매핑
em.persist()로 엔티티 저장 전 애플리케이션에서 기본 키를 직접 할당하는 방법
T t = new T();
t.setId("id1") // 기본키 직접 할당
em.persist(t)
기본 키 생성을 데이터베이스에 위임하는 전략
@GeneratedValue(strategy = GenerationType.IDENTITY)
데이터를 데이터베이스에 Insert한 후 기본 키 조회
👉 엔티티가 영속 상태가 되려면 식별자가 반드시 필요하다. 그러나 이 전략은 엔티티를 데이터베이스에 저장해야 식별자를 구할 수 있으므로 em.persis()를 호출하는 즉시 Insert SQL이 데이터베이스에 전달된다. 따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.
유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
@SequenceGenerator(name ="", sequenceName ="", initialValue ="", allocationSize ="")
👉 em.persist()를 호출할 때 먼저 데이터베이스 시퀀스를 사용해서 식별자를 조회한다. 그리고 조회한 식별자를 엔티티에 할당한 후에 엔티티 영속성 컨텍스트에 저장한다. 이후 트랜잭션 커밋해서 플러시가 일어나면 엔티티를 데이터베이스에 저장한다.
시퀀스 대신에 테이블을 사용한다는 것만 제외하면 내부 동작 방식이 같다.
@GeneratedValue
장점 : 데이터베이스를 변경해도 코드를 수정할 필요가 없다.
package jpabook.model.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
//getter, setter
}
Member 테이블 생성
@GeneratedValue는 H2데이터베이스를 사용하는데, Sequence를 사용한다.
package jpabook.model.entity;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name = "ORDERS")
public class Order {
@Id @GeneratedValue
@Column(name ="ODER_ID")
private Long id;
@Column(name = "MEMBER_ID")
private Long memberId;
@Temporal(TemporalType.TIMESTAMP)
private Date oderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
}
package jpabook.model.entity;
public enum OrderStatus {
ODER, CANCEL
}
주문 엔티티와 주문 상태
package jpabook.model.entity;
import javax.persistence.*;
@Entity
@Table(name = "ORDER_ITEM")
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "ORDER_ITEM_ID")
private Long id;
@Column(name = "ITEM_ID")
private Long itemId;
@Column(name = "ORDER_ID")
private Long orderId;
private int orderPrice; //주문 가격
private int count; //주문 수량
}
package jpabook.model.entity;
import javax.persistence.*;
@Entity
public class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name; //이름
private int price; //가격
private int stockQuantity; //재고수량
}
주문 상품 엔티티와 상품 엔티티
테이블의 외래키를 객체에 그대로 가져온 부분이 문제
-> 객체는 참조해서 연관된 객체를 찾고 테이블은 외래 키를 사용해서 연관된 테이블을 찾으므로 둘 사이에는 큰 차이가 있다.