반응형
JPA KEY 생성 전략
1. AUTO (기본값)
- JPA가 사용하는 데이터베이스 방언에 따라 키 생성 방식을 자동으로 선택합니다.
- 주로 SEQUENCE(PostgreSQL, Oracle) 또는 IDENTITY(MySQL, MariaDB)를 사용.
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
2. IDENTITY
- 데이터베이스가 자동으로 ID를 생성합니다.
- 매번 insert가 즉시 실행되며 쓰기 지연이나 batch insert는 불가능.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
3. SEQUENCE
- 데이터베이스의 시퀀스 객체를 사용하여 ID를 생성합니다.
- JPA가 미리 시퀀스를 조회하여 쓰기 지연 및 batch insert가 가능.
- 주로 PostgreSQL, Oracle에서 사용.
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1)
private Long id;
4. TABLE
- 테이블을 이용해 ID를 관리.
- 성능이 떨어지므로 잘 사용하지 않음.
- 주로 데이터베이스가 SEQUENCE나 IDENTITY를 지원하지 않을 때 사용.
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table")
@TableGenerator(name = "user_table", table = "id_gen", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize = 1)
private Long id;
여기서 문제점
IDENTITY 가 쓰기지연이나 Batch Insert 를 할 수 없는이유?
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
// 저장 코드
@Transactional
public void saveUsers() {
for (int i = 0; i < 10; i++) {
User user = new User();
user.setName("User" + i);
entityManager.persist(user);
}
}
아래와 같이 입력하게 되면
insert query가 세개가 나가게 된다.
이유: JPA에서 persist를 통해서 영속화 하려고 할땐 PK가 DB에 저장되어있어야하는데
위와 같은 코드로 쓰기지연 batch insert 를 하려고할 때 PK가 이미 지정 되어있지 않기 때문에 영속화를 할 수 없고, 매번 save 메서드를 실행하는 것이다.
반응형
'Spring > JPA' 카테고리의 다른 글
태태개발일지 - 비동기처리 (0) | 2024.12.11 |
---|---|
태태개발일지 - 트랜잭션? (0) | 2024.12.03 |
태태개발일지 - 양방향 연관관계 (1) | 2024.11.22 |
태태개발일지 - JPA 슈퍼타입 (1) | 2024.11.20 |
태태개발일지 - ActionQueue (3) | 2024.11.18 |