본문 바로가기
JPA

[JPA] 기본 키 매핑 방법

by 당코 2023. 2. 27.

기본 키 매핑 방법

  • 직접 할당
  • 자동 생성

 

직접 할당

@ID만 사용하여 기본 키를 정하고 값을 직접 할당하는 방법이다.

Member member = new Member();
member.setId("1"); // 기본키 직접 할당
em.persist(member);

 

자동 생성

@GenerateValue를 사용하여 자동으로 기본키를 생성한다.

  • IDENTITY: 기본키 생성을 데이터베이스에 위임한다.
  • SEQUENCE: 데이터베이스 시퀀스 오브젝트를 사용한다.
  • TABLE: 키 생성용 테이블을 사용한다.
  • • AUTO: 방언에 따라 자동 지정한다. 기본 값이다.

 

IDENTITY 전략

기본 키 생성을 데이터베이스에 위임한다.

주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다. (MySQL의 AUTO_INCREMENT)

JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행한다.

AUTO_ INCREMENT는 데이터베이스에 INSERT SQL을 실행 한 이후에 ID 값을 알 수 있다.

IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회한다.

@Entity 
public class Member { 
 @Id 
 @GeneratedValue(strategy = GenerationType.IDENTITY) 
 private Long id;

 

 

SEQUENCE 전략

유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트이다.

오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용한다.

@Entity 
@SequenceGenerator( 
 	name = “MEMBER_SEQ_GENERATOR", 
 	sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
 	initialValue = 1, allocationSize = 1) 
public class Member { 
	@Id 
	@GeneratedValue(strategy = GenerationType.SEQUENCE, 
 		generator = "MEMBER_SEQ_GENERATOR") 
 	private Long id;

@ SequenceGenerator를 통해 "MEMBER_SEQ_GENERATOR" 시퀀스 생성기를 등록한다.

매핑할 시퀀스 이름을 "MEMBER_SEQ"로 정하여 DB에 저장되어 있는 "MEMBER_SEQ" 시퀀스와 매핑한다.

@GenerateValue를 시퀀스 전략으로 정하고 시퀀스 생성기의 이름을 선택하면 키의 값을 자동으로 생성해 준다.

 

 

TABLE 전략

키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉 내내는 전략

모든 데이터베이스에 적용 가능하나 성능이 좋지 않다.

create table MY_SEQUENCES ( 
	sequence_name varchar(255) not null, 
	next_val bigint, 
	primary key ( sequence_name ) 
)

키 생성 용도로 사용할 Table을 생성하였다.

 

@Entity 
@TableGenerator( 
	name = "MEMBER_SEQ_GENERATOR",
	table = "MY_SEQUENCES", 
	pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
public class Member { 
	@Id 
	@GeneratedValue(strategy = GenerationType.TABLE, 
		generator = "MEMBER_SEQ_GENERATOR") 
 	private Long id;

@TableGenerator로 미리 생성해 놓은 테이블을 매핑한다.

그리고 @GenerateValue에 테이블 생성기를 지정해 준다.

id의 키 값은 Table에서 자동으로 생성해 매핑하게 된다.

 

출처 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

'JPA' 카테고리의 다른 글

[JPA] 프록시와 지연로딩  (2) 2023.03.05
[JPA] @MappedSuperclass 사용법  (0) 2023.03.03
[JPA] 상속관계 매핑  (0) 2023.03.03
[JPA] 연관관계 매핑  (0) 2023.02.28
[JPA] 영속성 컨텍스트  (0) 2023.02.26