참고
기본 키 매핑
NOTE
데이터베이스마다 기본키를 생성하는 방식이 서로 다르므로, 이를 해결하기는 쉽지 않다. JPA는 이런 문제들을 어떻게 해결했는가?
•
직접할당 : 기본 키를 애플리케이션에 직접 할당한다.
•
자동생성 : 대리키 사용방식
◦
IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.
◦
SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.
◦
TABLE : 키 생성 테이블을 사용한다.
IDENTITY 전략
NOTE
기본 키 생성을 데이터베이스에 위임하는 전략
@Entity
public class Badge {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Java
복사
•
AUTO INCREMENT를 사용하는 경우처럼, 데이터베이스에 값을 저장하고 나서야 기본값을 알아낼 수 있다
[ 참고]
•
IDENTITY 전략의 경우, 데이터베이스 생성이후 PK를 얻을 수 있으므로, JPA가 Commit 시점이 아닌, persist()시점에 바로 insert를 실행하고, DB에서 PK값을 가져와서 1차 캐시에 넣어준다.
•
이러한 이유때문에, IDENTITY에서는 지연쓰기가 제한된다. (성능에 크게 상관은 없음)
SEQUENCE 전략
NOTE
데이터베이스 시퀀스 오브젝트 사용, ORACLE
@Entity
@SequenceGenerator(
name = "BOARD_SEQ_GENERATOR".
sequenceName = ”BOARD_SEQ”, //매핑할 데이터베이스 시퀀스 이름
initialvalue = 1,
allocationsize = 1)
public class Board {
@IdQGeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
...
}
Java
복사
•
@SequenceGenerator등록이 필요하다.
•
데이터베이스 저장시, 데이터베이스에서 시퀀스를 조회해서 JPA 1차 캐시에 값을 저장한다.
◦
이 떄 시퀀스 조회를 위해 DB I/O 요청이 생긴다.
◦
하지만 InitialValue와 allocationSize를 조정함으로써 메모리에 미리 순번을 저장해 놓을 수 있다.
◦
따라서 대량의 Insert 쿼리가 주로 발생하는 Entity라면, 이 값을 설정해주는것이 좋다.
[ 참고]
•
InitialValue는 기본값이 1, allocationSize는 기본값이 50이다.
•
즉 1부터 한번에 50개의 순번을 가져오며, 늘리기 위해선 allocationSIze를 조정하면된다.
TABLE 전략
NOTE
키 생성용 테이블을 별도로 사용하며, 키를 생성한다. (잘 쓰이지는 않음)
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnName = "MEMBER_SEQ", allocationSize = 50)
public class Member2 {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
@Column(name = "MEMBER_ID")
private Long id;
...
}
Java
복사
•
@TableGenerator 등록이 필요하다.
•
키 생성 전용 테이블을 만들어서 시퀀스를 흉내내는 전략
AUTO 전략
NOTE
말 그대로 ‘자동’으로 적절한 전략을 얻어서 매핑시키며, @GeneratedValue만 쓰면 자동으로 적용된다.
@Entity
public class Badge {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
Java
복사