JPA가 제동하는 데이터베이스 기본키 생성 전략은 다음과 같다.
- 직접할당 : 기본키를 애플리케이션에서 직접할당
- 자동생성 : 대리키 사용방식 (IDENTITY, SEQUENCE, TABLE)
기본키 직접할당
em.persist()로 엔티티를 저장하기 전에 애플리케이션에서 기본키를 직접 할당하는 방법
Board board = new Board();
board.setId("id1") //기본키 직접 할당
em.persist(board);
기본키 자동생성 1) IDENTITY 전략
기본키 생성을 데이터베이스에 위임하는 전략..
CREATE TABLE BOARD (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
DATA VARCHAR(255)
);
INSERT INTO BOARD(DATA) VALUES('A');
INSERT INTO BOARD(DATA) VALUES('B');
테이블을 생성할 때 기본키 컬럼인 ID에 AUTO_INCREMENT를 추가!!
데이터베이스에 값을 저장할 때 ID 컬럼을 비워두면 데이터베이스가 순서대로 값을 채워준다.
IDENTITY 매핑코드
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
}
개발자가 엔티티에 직접 식별자를 할당하면 @Id 만 있으면 되지만
지금처럼 식별자가 생성되는 경우에는 @GeneratedValue 를 사용하여 식별자 생성 전략을 명시해야한다.
IDENTITY 사용코드
private static void logic (EntityManager em) {
Board board = new Board();
em.persist(board);
System.out.println("board.id = " + board.getId());
}
출력값
board.id = 1
기본키 자동생성 2) SEQUENCE 전략
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트 이다.
먼저 시퀀스를 생성해야한다.
CREATE TABLE BOARD (
ID BIGINT NOT NULL PRIMARY KEY,
DATA VARCHAR(255)
)
//시퀀스 생성
CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
SEQUENCE 매핑코드
@Entity
@SequenceGenerator (
name = "BOARD_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
....
}
SEQUENCE 사용코드
private static void logic (EntityManager em) {
Board board = new Board();
em.persist(board);
System.out.println("board.id = " + board.getId());
}
출력값
board.id = 1
기본키 자동생성 3) TABLE 전략
TABLE 전략은 키 생성 전용 테이블을 하나 만들고,
여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략.
TABLE 전략 키 생성 DDL
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key (sequence_name)
)
TABLE 매핑 코드
@Entity
@TableGenerator (
name = "BOARD_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "BOARD_SEQ", allocationSize = 1 )
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
....
}
TABLE사용코드
private static void logic (EntityManager em) {
Board board = new Board();
em.persist(board);
System.out.println("board.id = " + board.getId());
}
출력값
board.id = 1
기본키 자동생성 4) AUTO 전략
GenerationType.AUTO 는 선택한 데이터베이스 방언에 따라
IDENTITY, SEQUENCE, TABLE 전략중 하나를 자동으로 선택한다.
AUTO 매핑코드
@Entity
public class Board {
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
private Long id;
....
}
(strategy = GenerationType.AUTO) 이부분은 생략 가능
★기본키 매핑 정리★
- 직접할당 : em.persist() 를 호출하기 전에 애플리케이션에서 직접 식별자 값을 할당해야 한다.
- SEQUENCE : 데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장
- TABLE : 데이터베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장
- IDENTITY : 데이터베이스에 엔티티를 저장해서 식별자 값을 획득 한 후 영속성 컨텍스트에 저장
( IDENTITY 전략은 테이블에 데이터를 저장해야 식별자값을 획득할 수 있음)
'JPA' 카테고리의 다른 글
JPA시작(8)_객체 연관관계 / 테이블 연관관계 (0) | 2021.06.08 |
---|---|
JPA시작(7)_필드와 컬럼 매핑_속성에 따른 DDL 생성확인 @Column, @Enumerated, @Temporal, @Lob, @Transient, @Access (0) | 2021.06.07 |
JPA시작(5)_데이터베이스 스키마 자동생성 (0) | 2021.06.07 |
JPA시작(4)_다양한 매핑 사용 @Enumerated, @Temporal, @Lob, @Column, @UniqueConstraint (0) | 2021.06.07 |
JPA시작(3)_애플리케이션개발_기초편 (0) | 2021.06.07 |