티스토리 뷰

[JPA]

[JPA] 기본키 매핑

handr95 2020. 12. 22. 23:47
반응형

기본키 매핑

  • 직접 할당 : 기본 키를 애플리 케이션에서 직접 할당한다.
  • 자동 생성 : 대리 키 사용 방식
    • 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
«   2024/07   »
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
글 보관함