엔티티를 생성할 때 PK의 관리는 일반적으로 Database의 관리 영역에 있다. AUTO_INCREMENT 기능이나 Oracle의 경우 Sequence 등을 활용한다. (MySQL에서 Sequence기능 사용하기)
Entity의 INSERT 쿼리를 보낼 때 이러한 ID 매핑을 자동으로 해주는 어노테이션이 있다.
이 방식은 JPA가 데이터베이스에 따라 자동으로 선택하는 ID 생성 전략이다. 데이터베이스에 따라 GenerationType.IDENTITY, GenerationType.SEQUENCE, GenerationType.TABLE 중 하나를 사용하게 된다.
@Entity
public class TestEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
이 방식은 테이블의 AUTO_INCREMENT기능을 사용해 PK를 생성하는 방식이다.
@Entity
public class TestEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
이 전략은 데이터베이스의 Sequence 기능을 사용하여 PK를 생성한다. 시퀀스는 데이터베이스에서 고유한 값을 순차적으로 생성하는 기능이다. 주로 Oracle, PostgreSQL 등에서 사용된다.
Sequence를 사용하려면 @SequenceGenerator 어노테이션을 추가해야 한다.
그런데 MySQL을 사용하더라도 JPA가 자체적으로 시퀀스 기능과 동일한 방식으로 PK를 생성해준다. 아래의 코드를 작성하고 Build 실행하면 @SequenceGenerator에서 설정한 sequenceName의 이름으로 된 테이블도 같이 생성된 것을 볼 수 있을 것이다.
해당 테이블에서 PK Sequence를 관리하며 차례로 PK를 발급해주고 저장된 값을 UPDATE 해주는 것으로 보인다.
다만 이 방식은 뒤에서 설명할 TABLE 전략과 상당히 비슷하다.
@Entity
public class TestEntity {
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "TEST_ENTITY_ID_GENERATOR"
)
@SequenceGenerator(
name = "TEST_ENTITY_ID_GENERATOR",
sequenceName = "TEST_ENTITY_ID_SEQUENCE",
initialValue = 1,
allocationSize = 1
)
private Long id;
}
이 전략은 별도의 데이터베이스 테이블을 사용하여 ID를 생성한다. 이 테이블은 모든 엔티티에 대한 ID를 관리하며, 여러 엔티티에서 공유할 수 있다. @TableGenerator 어노테이션을 추가해야 한다.
@Entity
public class TestEntity {
@Id
@GeneratedValue(
strategy = GenerationType.TABLE,
generator = "TEST_ENTITY_ID_GENERATOR"
)
@TableGenerator(
name = "TEST_ENTITY_ID_GENERATOR",
table = "TEST_ENTITY_ID_TABLE",
pkColumnName = "TEST_ENTITY_PK_COLUMN_NAME",
valueColumnName = "gen_val",
allocationSize = 1
)
private Long id;
}