@Entity
가 붙은 클래스는 JPA가 관리아래 코드는 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다.
<property name="hibernate.hbm2ddl.auto" value="create" />
아래 코드에서 속성을 true로 설정하면 콘솔에 실행되는 테이블 생성 DDL을 출력할 수 있다.
<property name="hibernate.show_sql" value="true"/>
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name")
private String name;
@Enumerated(value = EnumType.STRING)
private RoleType roleType;
@Temporal(value = TemporalType.TIMESTAMP)
private Date createdAt;
@Temporal(value = TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
public Member() {
}
// Getter/Setter ...
}
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name", nullable = false)
private String username;
protected Member() {
}
// ....
}
em.persist()
메서드 호출 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회할 수 있다.Hibernate:
create table Member (
id bigint generated by default as identity,
name varchar(255) not null,
primary key (id)
)
@Entity
@SequenceGenerator(name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ",
initialValue = 1,
allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
Hibernate:
create sequence MEMBER_SEQ start with 1 increment by 1
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
Hibernate:
create table hibernate_sequences (
next_val bigint,
sequence_name varchar(255) not null,
primary key (sequence_name)
)
✔️권장하는 식별자 전략
- 기본 키 제약 조건 : null 아님, 유일성, 변하면 안 된다.
- 권장 : Long형 + 대체키 + 키 생성전략 사용
✔️Member 클래스
@Entity
@Table(name = "MEMBERS")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private Long id;
private String name;
private String city;
private String zipcode;
// Getter/Setter ...
}
✔️Order 클래스
@Entity
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ORDER_ID")
private Long id;
@Column(name = "MEMBER_ID")
private Long memberId;
private Date orderDate;
private OrderStatus status;
// Getter/Setter ...
}
✔️OrderItem 클래스
@Entity
public class OrderItem {
@Id @GeneratedValue
private Long id;
@Column(name = "ORDER_ID")
private Long orderId;
@Column(name = "ITEM_ID")
private Long itemId;
private int orderPrice;
private int count;
// Getter/Setter ...
}
✔️Item 클래스
@Entity
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
// Getter/Setter ...
}
❓MEMBERS, ORDERS 지정 이유 → 예약어 때문에 오류가 발생하는 것을 방지하기 위해