반응형
기본키 전략에는 크게 두가지가 있다.
직접 할당과 자동생성하는 방법이 있다.
직접 할당하는 방법에는 @Id 어노테이션만을 적용하고 EntityManager.persist를 이용하면 된다.
하지만 자동생성하는 방법은 대리키를 사용하여 각각 전략에 따라 맞추어 자동 생성한다.
1. GenterationType.IDENTITY
- 기본키 생성을 DB에 위임
- INSERT SQL후 DB에서 식별자를 조회
2. GenterationType.SEQUENCE
- @SequenceGenerator 속성
- 맵핑 DLL
create sequence [sequenceName]
start with [initialValue] increment by [allocationSize]
- e.g)
@Entity
@SequenceGenerator(
name = "SEQ_GENERATOR",
sequenceName = "SEQ",
initialValue = 1, allocationSize = 1)
public class JpaTest{
@Id
@GeneratedValue(stradgy = GenerationType.SEQUENCE,
generator = "SEQ_GENERATOR")
private Long id;
}
- 동작 순서
1. DB 시퀀스 생성
2. DB 생성
3. persist() 시점에 DB 시퀀스에서 식별자 조회 - 1st 통신
4. 트랜잭션 커밋 시점에 플러시로 INSERT SQL을 DB에 보내서 저장 - 2nd 통신
3. GenterationType.TABLE
- @TableGenerator 속성
- 맵핑 DLL
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key ( sequence_name )
)
- e.g)
@Entity
@TableGenerator(
name = "SEQ_GENERATOR",
table = "SEQ",
pkColumnValue = "SEQUENCE", allocationSize = 1)
public class JpaTest{
@Id
@GeneratedValue(stradgy = GenerationType.TABLE,
generator = "SEQ_GENERATOR")
private Long id;
}
- 동작 순서
1. DB 시퀀스 생성
2. DB 생성
3. persist() 시점에 DB 시퀀스에서 식별자 조회 - 1st 통신
4. 시퀀스 값을 증가 시키기 위해 UPDATE 실행 - 2nd 통신
5. 트랜잭션 커밋 시점에 플러시로 INSERT SQL을 DB에 보내서 저장 - 3rd 통신
4. GenterationType. AUTO
- DB에 따라 위의 전략 중 하나를 자동으로 선택
(e.g. Oracle : SEQUENCE, MySQL : IDENTITY)
- @GeneratedValue의 기본값은 AUTO이기에 속성을 선언하지 않아도 됨
반응형
'Backend > Spring | SpringBoot' 카테고리의 다른 글
[Spring] H2 및 JPA Properties적용 (0) | 2024.02.22 |
---|---|
[Error Log] PropertyReferenceException, NoSuchBeanDefinitionException, UnsatisfiedDependencyException (0) | 2024.02.21 |
application.yml 설정 (0) | 2024.02.19 |
Failed to load resource: the server responded with a status of 404 () (0) | 2024.02.19 |
i18n (0) | 2024.02.19 |