본문 바로가기

JPA

JPA 식별자 자동생성 방식

* 해당 게시글은 JPA의 공부를 위한 게시글로 JPA를 공부하며 이해했던 내용들을 정리하는 글입니다.

 

@Id와 @GeneratedValue 애노테이션을 식별자 변수에 추가하여 자동으로 증가된 값을 할당할 수 있습니다.

@GeneratedValue 속성은 2가지가 있습니다.

 

속성 설명
strategy 식별자 값 자동 생성 전략을 선택한다.(GenerationType 지정)
generator 생성된 키 생성기를 참조한다.

strategy 속성은 식별자 값 자동 생성 전략과 관련된 속성으로 TABLE, SEQUENCE, IDENTITY, AUTO 네 가지를 지정할 수 있습니다. 전략에 대한 설명은 다음과 같습니다.

 

PK 전략 해설
GenerationType.IDENTITY auto_increment나 IDENTITY를 이용하여 PK값을 생성합니다.
MySQL 같은 DBMS에서 사용 가능합니다.
GenerationType.SEQUENCE 시퀀스를 이용하여 PK값을 생성합니다. 오라클 같은 시퀀스를 지원하는 DBMS에서 사용 가능합니다.
GenerationType.TABLE 키 관리를 위한 전용 테이블을 사용하여 PK 값을 생성합니다.
GenerationType.AUTO 하이버네이트가 데이터베이스가 맞는 PK 값 생성 전략을 선택합니다.

 

IDENTITY 전략

  • EntityManager의 persist 메소드가 호출되는 순간 Insert 구문이 생성되어 데이터베이스에 전송됩니다.
  • 데이터베이스에서 IDENTITY 전략으로 키를 생성한 후 엔티티 클래스의 식별자 변수에 할당합니다.
  • 데이터가 추가된 것을 확인하려면 transaction이 commit 메소드가 호출 된 후 확인할 수 있습니다.
@Entity
@Data
@Table(name = "S_EMP")
public class Employee {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Column(length = 25, nullable = false, name = "e_name")
	private String name;
}

 

SEQUENCE 전략

  • 유일키를 생성하기 위해 시퀀스라는 별도의 오브젝트를 사용하기때문에 IDENTITY 전략과 다름
  • 시퀀스 오브젝트의 다음 값을 조회하여 해당 값을 식별자 변수에 할당
@Entity
@Data
@Table(name = "S_EMP")
@SequenceGenerator(name = "EMP_GENERATOR", 
					sequenceName = "EMP_SEQUENCE", 
					initialValue = 1, 
					allocationSize = 1)
public class Employee {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EMP_GENERATOR")
	private Long id;
	
	@Column(length = 25, nullable = false, name = "e_name")
	private String name;
}

 

TABLE 전략

  • 데이터베이스에 종속되지 않으며 별도의 식별자 테이블을 생성하여 식별값을 관리
  • SEQUENCE 전략과 동일한 방식으로 동작하지만 SEQUENCE 전략에 비해 성능 저하가 발생
@Entity
@Data
@Table(name = "S_EMP")
@TableGenerator(name = "EMP_GENERATOR", 
				pkColumnName = "SEQUENCE_NAME", 
				pkColumnValue = "SEQUENCE_EMP", 
				initialValue = 1, 
				allocationSize = 1)
public class Employee {

	@Id
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "EMP_GENERATOR")
	private Long id;
	
	@Column(length = 25, nullable = false, name = "e_name")
	private String name;
}

 

자동전략

  • 데이터베이스가 정해지지 않은 상태에서 사용하는 전략
@Entity
@Data
@Table(name = "S_EMP")
public class Employee {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	@Column(length = 25, nullable = false, name = "e_name")
	private String name;
}

 

출처

  • JPA 퀵스타트 책 참고

'JPA' 카테고리의 다른 글

JPA 영속 컨텍스트와 엔티티 상태  (0) 2020.12.12
JPA 엔티티 클래스 관련 애노테이션 알아보기  (0) 2020.12.10
JPA란?  (0) 2020.12.10