반응형
JPA의 기본 키 매핑에 대해서 공부한 내용을 간략히 기록해 봅니다.
(기본 내용 출처는 자바 ORM 표준 JPA 프로그래밍 책 입니다.)
JPA가 제공하는 데이터 베이스 기본 키 생성 전략은 아래와 같습니다.
- 직접 할당
- 기본 키를 어플리케이션에서 자동으로 직접 할당 한다.
- em.persist()를 호출하기 전에 어플리케이션에서 직접 식별자 값을 할당해야 한다.
- 만약 식별자가 없으면 예외가 발생한다.
- 참조 소스 - 책에 기재되어 있는 예제 소스로 상세한 내용은 별도로 찾아보시길 권장 합니다.
@Id @Column(name = "id") private String id; Baord board = new Board(); board.setId("id1") // 기본 키 직접 할당 em.persist(board);
- 자동생성
- IDENTITY 전략
- 기본 키 생성을 데이터베이스에 위임한다.
- 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
- 참고 소스
-
// IDENTITY DDL CREATE TABLE BAORD { ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, DATA VARCHAR(255) }; INSERT INTO BOARD(DATA) VALUES('A'); INSERT INTO BOARD(DATA) VALUES('B');
-
@Entity public class Board { @Id // MySQL에서 AUTO_INCREMENT로 식별자를 자동 생성하는 경우는 // 아래와 같이 애노테이션 전략을 설정해 주어야 한다. @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private static void logic(EntityManager em){ Board board = new Board(); em.persist(board); System.out.println("board.id = " + board.getId()); } } // 출력 : board.id = 1
-
- SEQUENCE 전략
- 데이터베이스 시퀀스를 사용해서 기본 키를 할당 한다.
- 시퀀스를 지원하는 Oracle, PostgreSQL, DB2, H2 데이터 베이스에서 사용할 수 있다.
- 참고소스
-
//시퀀스 DDL CREATE TABLE BOARD { ID BIGINT NOT NULL PRIMARY KEY, DATA VARCHAR(255) } //시퀀스 생성 CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
-
//시퀀스 매핑 코드 @Entity @SequenceGenerator( name = "BOARD_SEQ_GENERATOR", sequenceName = "BOARD_SEQ", //매핑할 데이터베이스 시퀀스 이름 initialValue = 1, allocationSize = 1 ) public class Board { @Id @GeneratedValue( strategy = GenerationType.SEQUENCE, // 매핑 등록한 시퀀스 생성기를 선택하였으므로 // id 식별자 값은 BOARD_SEQ_GENERATOR 시퀀스 생성기가 할당한다. generator = "BOARD_SEQ_GENERATOR" ) private Long id; } //시퀀스 사용 코드 private static void logic(EntityManager em){ Board board = new Board(); em.persist(board); System.out.println("board.id = " + board.getId()); } //출력 : board.id = 1
-
- TABLE 전략
- 키 생성 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 만드는 전략이다.
- 이 전략은 테이블을 사용하기 때문에 모든 데이터베이스에서 사용할 수 있다.
- 키 생성 용도로 사용할 테이블 생성이 필요하다.
- 참고소스
-
// 테이블 생성 DDL CREATE TABLE TABLE_SEQUENCE ( sequence_name varchar(255) not null, next_val bigint, primary key (sequence_name) )
-
//TABLE 전략 매핑 코드 @Entity @TableGenerator( name = "BOARD_SEQ_GENERATOR", table = "TABLE_SEQUENCES", //매핑할 테이블 이름 pkColumnValue = "BOARD_SEQ", allocationSize = 1 ) public class Board { @Id @GeneratedValue( strategy = GenerationType.TABLE, // 매핑 등록한 테이블 생성기를 선택하였으므로 // id 식별자 값은 BOARD_SEQ_GENERATOR 테이블 생성기가 할당한다. generator = "BOARD_SEQ_GENERATOR" ) private Long id; } //시퀀스 사용 코드 private static void logic(EntityManager em){ Board board = new Board(); em.persist(board); System.out.println("board.id = " + board.getId()); } //출력 : board.id = 1
-
- IDENTITY 전략
'Development Memories > JPA' 카테고리의 다른 글
【JPA】엔티티 매핑(Entity Mapping) - @Entity, @Table (0) | 2021.05.06 |
---|---|
【JPA】플러시(Flush) (0) | 2021.05.04 |
【JPA】Persistence Context(영속성 컨텍스트) 란 무엇인가? (0) | 2021.04.15 |
【JPA】Persistence.xml 설정 방법 (0) | 2021.04.11 |