- `@Entity`
- `@Table`
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
GenerationType.AUTO
GenerationType.IDENTITY
GenerationType.SEQUENCE
GenerationType.TABLE
@SequenceGenerator
@TableGenerator
@Column
@JoinColumn
@ManyToOne
@OneToMany(mappedBy = "")
@OneToOne
@ManyToMany
@JoinTable
JPA를 사용해서 테이블과 매핑할 클래스, 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.IDENTITY
GenerationType.SEQUENCE
GenerationType.TABLE
GenerationType.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
@Temporal
LocalDate
, 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
해당 필드를 매핑하지 않는다.