twocowsong

TABLE 전략 본문

IT/JPA

TABLE 전략

WsCode 2022. 5. 15. 20:12

깃허브 정리 URL : https://github.com/sWineTake/jpa.git

 

GitHub - sWineTake/jpa: 자바 ORM 표준 JPA 프로그래밍 - 김영한

자바 ORM 표준 JPA 프로그래밍 - 김영한. Contribute to sWineTake/jpa development by creating an account on GitHub.

github.com

TABLE 전략은 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 DB 시퀀스를 흉내내는 전략입니다.

 

아래와같이 TABLE을 생성 하겠습니다.

CREATE TABLE MY_SEQUENCES (
    SEQUENCE_NAME VARCHAR(255) NOT NULL,
    NEXT_VAL INT,
    PRIMARY KEY (SEQUENCE_NAME)
);

SEQUENCE_NAME 컬럼을 시퀀스 이름으로 사용하고 NEXT_VAL 컬럼을 시퀀스 값으로 사용합니다.

참고로 컬럼의 이름은 변경할 수 있는데 여기서 사용한 것이 기본 값입니다.

 

@Entity
@TableGenerator(
      name = "BOARD_SEQ_GENERATOR",
      table = "MY_SEQUENCES",
      pkColumnName = "BOARD_SEQ", allocationSize = 1
)
@Getter
@Setter
public class BoardTable {
   @Id
   @GeneratedValue(strategy = GenerationType.TABLE,
               generator = "BOARD_SEQ_GENERATOR")
   private Long id;
   ...
}

@TableGenerator를 사용해서 테이블 키 생성기를 등록했습니다.

여기서 BOARD_SEQ_GENERATOR라는 이름의 테이블 키 생성기를 등록하고 방금 생성한 MY_SEQUENCES 테이블을 키 생성용 테이블로 매핑하였습니다.

그리고 TABLE전략을 사용하기위해 @GeneratedValue.strategy 값을 GenerationType.TABLE 로 설정하였습니다.

@GeneratedValue.generator에 방금 만든 테이블 키 생성기를 지정했습니다.

 

이제부터 ID 식별자 값은 BOARD_SEQ_GENERATOR 테이블 키 생성기가 할당합니다.

BoardTable board = new BoardTable();
em.persist(board);
System.out.println("board id : " + board.getId());

TABLE 전략은 시퀀스 대신에 테이블을 사용한다는것만 제외하면 SEQUENCE전략과 내부 동작방식이 같습니다.

 

위의 em.persist를 실행하면 아래와같이 데이터가 추가됩니다.

my_sequences 테이블을 보면 pkColumnName = "BOARD_SEQ"가 컬럼명으로 추가된것을 확인할수 있습니다.

my_sequences

이제 키 생성기를 사용할때마다 next_val 컬럼 값이 증가합니다. 

(저는 테스트로 반복문으로 10번을 반복하여서 next_val 값이 10이 나왔습니다. 정상적으로 1이 출력됩니다.)

 


@TableGenerator를 분석하면 아래와 같습니다.

속성 기능 기본값
name 식별자 생성기 이름 필수
table 키생성 테이블명 hibernate_sequences
pkColumnName 시퀀스 컬럼명 sequence_name
valueColumnName 시퀀스 값 컬럼명 next_val
pkColumnValue 키로 사용할 값 이름 엔티티 이름
initialValue 초기 값, 마지막으로 생성된 값이 기준 0
allocationSize 시퀀스 한 번 호출에 증가 하는 수 ( 성능 최적 화에 사용) 50
catalog, schema DB catalog, schema이름  
uniqueConstraints(DDL) 유니크 제약 조건을 지정  

 

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

기본 키 매핑 정리  (0) 2022.05.16
AUTO 전략  (0) 2022.05.16
SEQUENCE 전략  (0) 2022.05.14
IDENTITY 전략  (0) 2022.05.13
기본 키 직접 할당 전략  (0) 2022.05.13