본문 바로가기

Framework/JPA

[JPA] 기본 키 자동 생성 - @Id, @GenarateValue 전략

반응형

Entity에서 기본키를 매핑

 

@Id 만 사용할 경우 직접 할당

@Id
private Long id;

사용 시

Member member = new Member();
member.setId(1L);
member.setUsername("memberA");

// 영속
em.persist(member);

 

@GenerateValue를 사용하여 자동 할당 가능

Member member = new Member();
member.setUsername("memberA");

// 영속
em.persist(member); // id 자동 생성

 

4가지 전략이 존재한다.

 

- IDENTITY

  DB에 위임하는 방식 ex) Mysql - AUTO_INCREMENT

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

 

 - SEQUENCE

  DB의 SEQUENCE를 이용하는 방식

@SequenceGenerator(
        name = "ID_SEQ"
        , sequenceName = "ID_SEQ"
        , initialValue = 1
        , allocationSize = 1
)
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_SEQ")
    private Long id;

name : Generator의 이름

sequenceName : 실제 DB의 시퀀스 이름

initialValue : DDL 생성시 초기값

* allocationSize : 시퀀스 호출시 증가하는 수

 -> allocationSize = 50 설정 시 어플리케이션에서 1~51까지 미리 할당을 받은 후 사용 -> 성능 최적화

 

 - Table

  DB의 테이블을 시퀀스 형식으로 사용

@TableGenerator(
        name = "ID_SEQ_TABLE"
        , table = "ID_SEQ_INFO"
        , pkColumnValue = "MEMBER_SEQ"
        , initialValue = 1
        , allocationSize = 1
)
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "ID_SEQ_TABLE")

name : Generator 이름

table : DB 테이블 이름

pkColumnValue : 테이블 컬럼의 SEQUENCE_NAME의 값

 

ex)

SEQUENCE_NAME  NEXT_VAL 
MEMBER_SEQ 1

 

- AUTO

 사용 DB에 따라 위의 3가지 중 자동 설정

반응형

'Framework > JPA' 카테고리의 다른 글

[JPA] Proxy 객체 / 지연 로딩(LAZY), 즉시 로딩(EAGER)  (0) 2022.05.13