기본 키 매핑
기본 키 매핑 어노테이션
@Id
@GeneratedValue
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
기본 키 매핑방법에는 직접 할당 방법과 자동 생성 방법이 있다.
직접 할당 방법은 @Id만 사용하고,
자동 생성 방법은 @GeneratedValue를 사용한다. 옵션은 다음과 같다.
옵션 - IDENTITY
데이터베이스에 위임한다.(MYSQL)
옵션 - SEQUENCE
데이터베이스에 시퀀스 오브젝트를 사용한다.(ORACLE)
해당 옵션을 사용하려면 @SequenceGenerator 가 필요하다.
옵션 - TABLE
키 생성용 테이블을 사용하고, DB에서 사용한다.
해당 옵션을 사용하려면 @TableGenerator 가 필요하다.
옵션 - AUTO
데이터베이스 방언에 따라 자동으로 지정되며, 기본값이다.
IDENTITY 전략
기본 키 생성을 데이터베이스에 위임한다.
주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다. 예) MySQL : AUTO_INCREMENT)
JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL를 실행한다.
AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID 값을 알 수 있다.
IDENTITY 전략은 em.persists() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회한다.
@Entity
public class RemindMember {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
}
SEQUENCE 전략
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트 예) ORACLE 시퀀스
ORACLE, PostgreSQL, DB2, H2 데이터베이스에서 사용한다.
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class RemindMember {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
}
SEQUENCE - @SequenceGenerator
여기서 주의할 점은 allocationSize 의 기본 값은 50이라는 점이다.
@SequenceGenerator의 속성 값을 알아보자.
속성 - name
식별자를 생성기의 이름이다. 필수로 입력해야 한다.
속성 - sequenceName
데이터베이스에 등록되어 있는 시퀀스 이름이다.
기본 값으로 hibernate_sequence 값이 할당된다.
속성 - initialValue
DDL 생성 시에만 사용되며, 시퀀스 DDL을 생성할 때, 처음 1 시작하는 수를 지정한다.
속성 - allocationSize
시퀀스 한 번 호출에 증가하는 수이며, 성능 최적화에 사용된다.
데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다.
기본 값은 50이다. (미리 1,50, 51~101까지 시퀀스를 설정해 놓는다. -> 성능 최적화)
TABLE 전략
키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내 내는 전략이다.
모든 데이터베이스에 적용 가능한 장점이 있지만 성능 측면의 문제점이 있다.
@Entity
@TableGenerator(name = "MEMBER_SEQ_GENERATOR",
table ="MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ",
allocationSize = 1)
public class RemindMember {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
}
실행하면 JPA는 MY_SEQUENCES 라는 테이블을 다음과 같이 생성한다.
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key (sequence_name)
)
@TableGenerator 속성
속성 - name
식별자 생성기 이름이다. 필수 속성을 기본으로 하고 있다.
속성 - table
키생성 테이블명이다. 기본 값은 hibernate_sequences 이다.
속성 - valueColumnNa
시퀀스 값 컬러명이며, 기본 값은 next_val이다.
속성 - pkColumnValue
키로 사용할 값 이름이며, 기본 값은 엔티티 이름이다.(RemindMember)
속성 - initialValue
초기 값, 마지막으로 생성된 값이 기준이다. 기본 값은 0이다.
속성 - allocationSize
시퀀스 한 번 호출에 증가하는 수이며 성능최적화에 사용된다.
기본 값은 50이다.
속성 - catalog, schema
데이터베이스 catalog와 schema 이름이다.
속성 - uniqueConstraints(DDL)
유니크 제약 조건을 지정할 수 있다.
권장하는 식별자 전략
JPA에서 권장하는 식별자 전략은...
기본 키 제약조건은 null 아님, 유일해야 하며, 불변 값이어야 한다.
미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 사용해야 한다.
권장하는 방법은 Long형 + 대체키 + 키 생성전략을 사용해야 한다.
'JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑 - 양방향 연관관계와 연관관계 주인 (0) | 2023.04.04 |
---|---|
[JPA] 연관관계 매핑 - 객체지향 모델링 단방향 매핑 (0) | 2023.04.04 |
[JPA] 엔티티 매핑 - 객체와 테이블 매핑, 필드와 컬럼 매핑 (0) | 2023.02.26 |
[JPA] 변경감지와 플러시 (0) | 2023.02.24 |
[JPA] JPA 핵심 - 영속성 컨테이너 (0) | 2023.02.24 |