Table of Contents
@Entity
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 필수로 붙여야 한다. 이는 JPA가 관리하는 것으로 엔티티라 부른다.
- 기본 생성자는 필수 : JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
- 저장할 필드에 final을 사용하면 안 된다.
@Table
@Table은 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용
데이터베이스 스키마 자동 생성
다음 속성을 persistence.xml에 추가하자
1
<property name="hibernate.hbm2ddl.auto" value="create" />
해당 속성은 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다 스키마 자동 생성 기능을 사용하면 애플리케이션 실행 시점에 데이터베이스 테이블이 자동으로 생성되므로 개발자가 테이블을 직접 생성하는 수고를 덜 수 있다.
DDL 생성 기능
1
2
@Column(name = "NAME", nullable = false, length = 10)
private String username;
@Column 매핑 정보의 nullable 속성 값을 false로 지정하면 자동 생성되는 DDL에 not null 제약조건을 추가할 수 있다. length 속성 값을 사용하면 자동 생성되는 DDL에 문자의 크기를 지정할 수 있다.
다음은 uniqueConstraints 속성을 추가한 것이다.
1
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraints(name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"})})
이런 기능들은 단지 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다. 따라서 스키마 자동 생성 기능을 사용하지 않고 직접 DDL을 만든다면 사용할 이유가 없다.
기본 키 매핑
- 직접 할당: 기본 키를 애플리케이션에서 직접 할당
- 자동 생성: 대리 키 사용 방식
- IDENTIT: 기본 키 생성을 데이터베이스에 위임
- SEQUENCE: 데이터베이스 시퀸스를 사용해서 기본 키를 할당
- TABLE: 키 생성 테이블을 사용
기본 키 직접 할당 전략
@Id로 매핑하면 된다.
적용 가능한 자바 타입은 다음과 같다.
- 자바 기본형
- 자바 래퍼
- String
- java.util.Date
- java.sql.Date
- java.math.BigDecimal
- java.math.BigInteger
직접 할당 전략은 em.persist()로 엔티티를 저장하기 전에 애플리케이션에서 기본 키를 직접 할당하는 방법
IDENTITY 전략
기본 키 생성을 데이터베이스에 위임하는 전략 데이터베이스에 값을 저장할 때 ID 컬럼을 비워두면 데이터베이스가 순서대로 값을 채워준다.
사용법은 아래와 같다.
1
2
3
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
엔티티가 영속 상태가 되려면 식별자가 반드시 필요하다. IDENTITY 식별자 생성 전략은 엔티티를 데이터베이스에 저장해야 식별자를 구할 수 있으므로 em.persist()를 호출하는 즉시 INSERT SQL이 데이터베이스에 전달된다. 따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.
SEQUENCE 전략
사용법은 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
@Entity
@SequenceGenerator(
name = "BOARD_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ",
initialValue = 1, allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
...
}
SEQUENCE 전략은 em.persist()를 호출할 때 먼저 데이터베이스 시퀸스를 사용해서 식별자를 조회한다. 그리고 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다. 이후 트랜잭션을 커밋해서 플러시가 일어나면 엔티티를 데이터베이스에 저장한다.
TABLE 전략
키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀸스를 흉내내는 전략
사용법은 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
@Entity
@TableGenerator(
name = "BOARD_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "BOARD_SEQ", allocationsize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
...
}
TABLE 전략은 시퀸스 대신에 테이블을 사용한다는 것만 제외하면 SEQUENCE 전략과 내부 동작방식이 같다
AUTO 전략
GenerationType.AUTO는 선택한 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택
SEQUENCE나 TABLE 전략이 선택되면 시퀸스나 키 생성용 테이블을 미리 만들어 두어야 한다. 만약 스키마 자동 생성 기능을 사용한다면 하이버네이트가 기본값을 사용해서 만들어 줄 것이다.
필드와 컬럼 매핑
분류 | 매핑 어노테이션 | 설명 |
---|---|---|
필드 컬럼 매핑 | @Column | 컬럼을 매핑 |
@Enumerated | enum 타입을 매핑 | |
@Temporal | 날짜 타입을 매핑 | |
@Lob | BLOB, CLOB 타입을 매핑 | |
@Transient | 특별 필드를 데이터베이스에 매핑하지 않는다. | |
기타 | @Access | JPA가 엔티티에 접근하는 방식을 지정 |
@Access
- 필드 접근: AccessType.FIELD, 필드에 직접 접근, private이라도 접근 가능
- 프로퍼티 접근: AccessType.PROPERTY, 접근자를 사용한다.