Search
Duplicate
📒

[JPA 기본] 04-3. 엔티티 맵핑 - 기본 키 맵핑

상태
완료
수업
JPA
주제
JPA
4 more properties
참고

기본 키 매핑

NOTE
데이터베이스마다 기본키를 생성하는 방식이 서로 다르므로, 이를 해결하기는 쉽지 않다. JPA는 이런 문제들을 어떻게 해결했는가?
직접할당 : 기본 키를 애플리케이션에 직접 할당한다.
자동생성 : 대리키 사용방식
IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.
SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.
TABLE : 키 생성 테이블을 사용한다.

IDENTITY 전략

NOTE
기본 키 생성을 데이터베이스에 위임하는 전략
@Entity public class Badge { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
Java
복사
AUTO INCREMENT를 사용하는 경우처럼, 데이터베이스에 값을 저장하고 나서야 기본값을 알아낼 수 있다
[ 참고]
IDENTITY 전략의 경우, 데이터베이스 생성이후 PK를 얻을 수 있으므로, JPACommit 시점이 아닌, 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 요청이 생긴다.
하지만 InitialValueallocationSize를 조정함으로써 메모리에 미리 순번을 저장해 놓을 수 있다.
따라서 대량의 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
복사