티스토리 뷰
기본키 매핑
- 직접 할당 : 기본 키를 애플리 케이션에서 직접 할당한다.
- 자동 생성 : 대리 키 사용 방식
-
IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.
-
SEQUENCE : 데이터베이스 시퀀스를 사용하여 기본 키를 할당한다.
-
TABLE : 키 생성 테이블을 사용한다.
-
기본키 직접 할당
@Id
@Column(name="id")
private String id;
@Id 선언 후 em.persist()하기 전 기본키를 직접 입력
Board board = new Board();
board.setId("id1"); //기본키 직접 할당
em.persist(board);
@Id 적용 가능 자바 타입
-
자바 기본형
-
자바 래퍼(Wrapper)형
-
String
-
java.util.Date
-
java.sql.Date
-
java.math.BigDecimal
-
java.math.BigInteger
IDENTITY 전략
기본 키 생성을 데이터 베이스에 위임
MYSQL, PostgreSQL, SQL Server, DB2에서 사용
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private String id;
@GeneratedValue의 strategy 속성값을 GenerationType.IDENTITY로 지정
Board board = new Board();
em.persist(board); //DB에 기본키 생성 위임
System.out.println(board.getId()); //DB에서 식별자를 조회함.(select 문 실행됨)
SEQUENCE 전략
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트다.
//시퀀스 생성
CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
SEQUENCE 전략은 이 시퀀스를 사용하여 기본 키를 생성함.
ORACLE, PostgreSQL, DB2, H2 Database에서 사용
@Entity
@SequenceGenerator {
name = "BOARD_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ", //매핑할 데이터 베이스 스퀀스 이름
initialVale=1, allocationSize=1)
public vlass Board {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,
generator="BOARD_SEQ_GENERATOR")
private Long id;
}
@SequenceGenerator를 이용하여 BOARD_SEQ_GENERATOR 라는 시퀀스 생성기 등록
sequenceName 속성의 이름으로 실제 데이터베이스 시퀀스 BOARD_SEQ 지정
@GeneratedValue의 strategy 속성값을 GenerationType.SEQUENCE로 지정,
generator로 방금 등록한 시퀀스를 지정.
Board board = new Board();
em.persist(board); //데이터베이스 시퀀스를 사용해서 식별자를 먼저 조회, 그 후 엔티티를 영속성 컨텐스트에 저장.
System.out.println(board.getId());
@SequenceGenerator 속성
속성 | 기능 | 기본값 |
name | 식별자 생성기 이름 | 필수 입력값 |
sequenceName | 데이터베이스에 등록되어있는 시퀀스 이름 | hibernate_sequence |
initialValue | DDL 생성 시에만 사용. 시퀀스 DDL을 생성할 때 처음 시작하는 수 지정 |
|
allocationSize | 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) | 50 |
catalog, schema | 데이터베이스 catalog, schema 이름 |
create sequence [sequenceName]
start with [initialValue] increment by [allocatioinSize]
TABLE 전략
키 생성 전용 테이블을 하나 만들어 데이터베이스 시퀀스를 흉내내는 적략
CREATE TABLE MY_SEQUENCES {
SEQUENCE_NAME VARCHAR(255) NOT NULL,
NEXT_VAL BIGINT,
PRIMARY_KEY (SEQUENCE_NAME)
}
SEQUENCE_NAME 컬럼을 시퀀스 이름으로 사용하고 NEXT_VAL 컬럼을 시퀀스 값으로 사용
@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;
}
@TableGenerator 이용하여 테이블 키 생성기 등록
@GeneratedValue의 strategy 속성값을 GenerationType.Table로 지정
generator 속성값에 등록한 테이블 키 생성기 이름 입력
Board board = new Board();
em.persist(board); //테이블에 값이 없다면 JPA에서 값을 INSERT하면서 초기화 함.(값을 미리 넣어둘 필요X)
System.out.println(board.getId());
@TableGenerator
속성 | 기능 | 기본값 |
name | 식별자 생성기 이름 | 필수 |
table | 키생성 테이블명 | hibernate_sequences |
pkColumnName | 시퀀스 컬럼명 | sequence_name |
valueColumnName | 시퀀스 값 컬럼명 | next_val |
pkColumnName | 키로 사용할 값 이름 | 엔티티 이름 |
initialValue | 초기 값. 마지막으로 생성된 값이 기준 | 0 |
allocationSize | 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용) | 50 |
catalog, schema | 데이터베이스 catalog, schema 이름 | |
uniqueConstraints(DDL) | 유니크 제약 조건을 지정할 수 있다 |
AUTO 전략
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
선택한 데이터 베이스에 따라 전략을 자동으로 선택(ex. MYSQL - IDENTITY 사용, ORACLE - SEQUENCE 사용)
출처
'[JPA]' 카테고리의 다른 글
[JPA] 한글 깨짐 (0) | 2021.02.28 |
---|---|
[JPA] hibernate.hbm2ddl.auto 옵션 (0) | 2020.12.21 |
[JPA] Not a managed type: class 에러 (0) | 2020.11.28 |
- Total
- Today
- Yesterday
- JAVA8
- chmod
- JUnit
- Redis
- Executor
- java11
- spring
- java
- IntelliJ
- 파스칼 표기법
- gradle
- Visual Studio 2022
- codepoint
- Thread
- 확인창
- JetBrains Mono
- jdk13
- spring-security
- junit5
- thread priority
- sgw
- hot-deploy
- JPA
- Jenkins
- Mockito
- 한글깨짐
- jdk12
- 카멜 표기법
- ThreadPool
- aspectj
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |