TABLE 전략
깃허브 정리 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"가 컬럼명으로 추가된것을 확인할수 있습니다.
이제 키 생성기를 사용할때마다 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) | 유니크 제약 조건을 지정 |