객체와 테이블 매핑: @Entity, @Table
필드와 컬럼 매핑: @Column
기본 키 매핑: @ID
연관관계 매핑: @ManyToOne, @JoinColumn
@Entity
@Table
DDL(Data Definition Language)을 애플리케이션 실행 시점에 자동 생성
테이블 중심 → 객체 중심
데이터베이스 방언 활용
이렇게 생성된 DDL은 개발 장비에서만 사용 (운영 서버에서 사용 X)
<property name="hibernate.hbm2ddl.auto" value=" " />
옵션 | 설명 |
---|---|
create | 기존 테이블 삭제 후 다시 생성 (DROP + CREATE) |
create-drop | create와 같으나 종료 시점에 테이블 DROP |
update | 변경분만 반영 (운영DB 사용 X) - 삭제 반영 X |
validate | 엔티티와 테이블이 정상 매핑되었는지만 확인 |
none | 사용하지 않음 |
데이터베이스 방언 별로 달라짐 (varchar)
주의!!!
운영 장비에는 절대 create, create-drop, update 사용하면 XXX
개발 초기 단계 - create 또는 update
테스트 서버 - update 또는 validate
스테이징과 운영 서버 - validate 또는 none
DDL 생성 기능
DDL 자동 생성시에만 사용되고 JPA 실행 로직에는 영향 주지 않음
@Column(nullable = false, length = 10)
@Table(uniqueConstraints = (@UniqueConstraint(name = "NAME_AGE_UNIQUE", columnNames=("NAME", "AGE"))))
package hellojpa;
import javax.persistence.*;
import java.util.Date;
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
public Member() {
}
// Getter, Setter...
}
@Column - 컬럼 매핑
@Enumerated - 자바 enum 타입을 매핑
주의! ORDINAL 사용 X - 순서 변경되면 문제 생길 수 있음
@Temporal - 날짜 타입(java.util.Date, java.util.Calendar) 매핑
@LOB - 데이터베이스 BLOB, CLOB 타입과 매핑
@Transient - 필드 매핑 X, 데이터베이스에 저장 X, 조회 X
직접 할당: @Id
자동 생성: @GeneratedValue
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
DB에 값이 들어가야 id 값을 알 수 있음em.persist()
시점에 즉시 INSERT SQL을 실행@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
seqName = "MEMBER_SEQ", // 매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(stratege = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
allocationSize 기본 값: 50@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(stratege = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
권장하는 식별자 전략
데이터 중심 설계의 문제점