- `@Entity`
- `@Table`
@Id@GeneratedValue(strategy = GenerationType.IDENTITY)GenerationType.AUTOGenerationType.IDENTITYGenerationType.SEQUENCEGenerationType.TABLE@SequenceGenerator@TableGenerator@Column@JoinColumn@ManyToOne@OneToMany(mappedBy = "")@OneToOne@ManyToMany@JoinTableJPA를 사용해서 테이블과 매핑할 클래스, Entity
| 속성 | 기능 | 기본값 | 
|---|---|---|
| name | Entity 이름 | this.class.getSimpleName() | 
JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용한다.
엔티티와 매핑할 테이블을 지정한다.
| 속성 | 기능 | 기본값 | 
|---|---|---|
| name | 매핑할 Table 이름 | @Entity.name | 
| catalog | catalog를 매핑한다. | |
| schema | schema를 매핑한다. | |
| uniqueConstraints (DDL) | DDL 자동 생성 시, unique constraints를 만든다. | 
@Entity
@Table(
	name = "MEMBER", 
	uniqueConstraints = {
		@UniqueConstraint(
			name = "UNIQUE_GROUP_TEAM", 
			columnNames = {"groupId", "teamId"}
		)
	}
)
public class Member {
	// ...
}
META-INF/persistence.xml<?xml version="1.0" encoding="UTF-8"?>  
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">  
    <persistence-unit name="unit-name">  
        <properties>  
            <!-- 필수 속성 -->  
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>  
            <property name="javax.persistence.jdbc.user" value="sa"/>  
            <property name="javax.persistence.jdbc.password" value=""/>  
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/Workspace/h2-test/test"/>  
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />  
  
            <!-- 옵션 -->  
            <property name="hibernate.hbm2ddl.auto" value="create"/>  
            <property name="hibernate.show_sql" value="true" />  
            <property name="hibernate.format_sql" value="true" />  
            <property name="hibernate.use_sql_comments" value="true" />  
            <property name="hibernate.id.new_generator_mappings" value="true" />  
  
            <property name="hibernate.hbm2ddl.auto" value="create" /> 
        </properties>  
    </persistence-unit>  
</persistence>
<property name="hibernate.hbm2ddl.auto" value="create" /> 
| 옵션 | 설명 | 
|---|---|
| create | DROP + CREATE | 
| create-drop | DROP + CREATE + DROP | 
| update | 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정한다. | 
| validate | DDL 수정하지 않는다. 유효성만 체크한다. | 
| none | 자동생성 기능 미사용 | 
카멜 표기법에서 언더 스코어 표기법으로 자동 변경해줌
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> 
객체 필드와 테이블의 기본키 매핑
GenerationType.IDENTITYGenerationType.SEQUENCEGenerationType.TABLEGenerationType.AUTO@Entity
@Table(name = "MEMBER")
@NoArgsConstructor
@Setter
@Getter
class Member {
	@Id
	private Long id;
}
Member member = new Member();
member.setId(1001L);
em.persist(member);
기본 키 생성을 데이터베이스에 위임하는 전략이다.
주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
em.persist()를 호출하는 즉시 INSERT SQL이 데이터베이스에 전달된다.@Entity
@Table(name = "MEMBER")
@NoArgsConstructor
@Setter
@Getter
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
}
Sequence는 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트이다.
@Entity
@Table(name = "MEMBER")
@SequenceGenerator(
	name = "BOARD_SEQ_GENERATOR",
	sequenceName = "BOARD_SEQ",
	initialValue = 1, allocationSize = 1
)
@NoArgsConstructor
@Setter
@Getter
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOARD_SEQ_GENERATOR")
	private Long id;
}
| 속성 | 기능 | 기본값 | 
|---|---|---|
| name | SequenceGenerator 이름 | 필수값 | 
| sequenceName | 데이터베이스 Sequence 이름 | hibernate_sequence | 
| initialValue | DDL 생성 시에만 사용됨. | 1 | 
| allocationSize | Sequence 한 번 호출에 증가하는 수(성능 최적화에 사용됨) | 50 | 
| catalog, schema | 데이터베이스 catalog, schema 이름 | 
CREATE SEQUENCE ${sequenceName}
START WITH ${initialValue} INCREMENT BY ${allocationSize};
SELECT ${sequenceName}.NEXTVAL FROM DUAL;
키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 sequence를 흉내내는 전략이다.
CREATE TABLE TABLE_SEQUENCES (
	SEQUENCE_NAME VARCHAR(255) NOT NULL,
	NEXT_VAL BIGINT
)
ALTER TABLE TABLE_SEQUENCES
ADD CONSTRAINT PK_TABLE_SEQUENCES PRIMARY KEY (SEQUENCE_NAME)
@Entity
@Table(name = "MEMBER")
@TableGenerator(
	name = "BOARD_SEQ_GENERATOR",
	table = "TABLE_SEQUENCES",
	pkColumnValue = "MEMBER_SEQ",
	allocationSize = 1
)
@NoArgsConstructor
@Setter
@Getter
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "BOARD_SEQ_GENERATOR")
	private Long id;
}
| 속성 | 기능 | 기본값 | 
|---|---|---|
| name | TableGenerator 이름 | 필수값 | 
| table | 키생성 테이블 이름 | hibernate_sequences | 
| pkColumnName | Seqeunce 컬럼명 | sequence_name | 
| valueColumnName | Sequence 값 컬럼명 | next_val | 
| pkColumnValue | 키로 사용할 값 이름 | 엔티티 이름 | 
| initialValue | 초기 값. 마지막으로 생성된 값 | 0 | 
| allocationSize | Sequence 한 번 호출에 증가하는 수(성능 최적화에 사용됨) | 50 | 
| catalog, schema | 데이터베이스 catalog, schema 이름 | |
| uniqueConstraints (DDL) | 유니크 제약 조건을 지정할 수 있다. | 
데이터베이스 Dialect에 따라
IDENTITY,SEQUENCE,TABLE전략 중 하나를 자동으로 선택한다.
@GeneratedValue.strategy의 기본 값은AUTO
@Entity
@Table(name = "MEMBER")
@NoArgsConstructor
@Setter
@Getter
public class Member {
	@Id
	@GeneratedValue
	private Long id;
}
@OneToMany(mappedBy = "")@OneToOne@ManyToMany@JoinTable객체 필드와 테이블 컬럼 매핑
@Column@Enumerated@TemporalLocalDate, LocalDateTime)@Lob@Transient| 속성 | 기능 | 기본값 | 
|---|---|---|
| name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 | 
| insertable | 엔티티 저장시 이 필드도 같이 저장 | true | 
| updatable | 엔티티 수정 시 이 필드도 같이 수정 | true | 
| table | 필드와 매핑할 컬럼이 속한 테이블 | 현재 클래스가 매핑된 테이블 | 
| nullable (DDL) | true | |
| unique (DDL) | 한 컬럼에 간단히 유니크 제약조건 | |
| columnDefinition (DDL) | 매핑할 데이터베이스 컬럼 정보 | |
| length (DDL) | 문자 길이 제약조건, String 타입에만 사용 | 255 | 
| precision, scale (DDL) | precision은 소수점 포함 전체 자릿수, scale은 소수의 자릿수 | precision=19, scale=2 | 
@Enumerated(value = EnumType.STRING)
@EnumType.ORDINAL@EnumType.STRING해당 필드를 매핑하지 않는다.