일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- @Entity
- anyMatch
- @Table
- Transaction not successfully started
- 멱등활용
- gitreset
- 캐쉬가능
- HTTP3
- http
- hibernate.dialect
- 네이버로그인API
- 매핑정보가없는필드
- Git
- HTTPMESSAGE
- RFC723x
- 네이버 연결된 서비스
- ERROR TYPE : org.apache.ibatis.binding.BindingException
- 무상태프로토콜
- JPA
- SpringBoot
- Invalid bound statement (not found)
- initialDelay
- org.apache.ibatis.binding.BindingException
- DB방언
- 데이터베이스 방언
- 김영한JPA
- fixedDelay
- KAKAOLOGINAPI
- 자바ORM표준프로그래밍
- gitrevert
- Today
- Total
twocowsong
IDENTITY 전략 본문
깃허브 정리 URL : https://github.com/sWineTake/jpa.git
IDENTITY는 기본 키 생성을 DB에 위임하는 전략입니다.
예를 들어 MySql의 AUTO_INCREMENT 기능은 DB 기본 키를 자동으로 생성해줍니다.
MySql에서 특정 컬럼의 아래와같이 생성시키면 자동으로 순차적으로 번호를 생성하여 ROW를 추가합니다.
CREATE TABLE BOARD(
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
DATA VARCHAR(255)
);
테이블 생성 시 기본 키 컬럼인 ID에 AUTO_INCREMENT를 추가하였습니다.
이제 부터는 순차적으로 ID값을 자동으로 채워줍니다.
(본 글에서는 AUTO_INCREMENT 상세 내용은 넘어가겠습니다.)
IDENTITY전략은 지금 설명한 AUTO_INCREMENT를 사용한 DB값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용합니다.
개발자가 엔티티에 직접 식별자를 할당하면 @Id 어노테이션만 있으면 되지만 지금처럼 식별자가 생성되는 경우에는 @GeneratedValue어노테이션을 사용하고 식별자가 생성 전략을 선택해야 합니다.
IDENTITY전략을 사용하려면 @GeneratedValue의 strategy속성 값을 GenerationType.IDENTITY로 지정하면 됩니다.
이 전략을 사용하면 JPA는 기본 키 값을 얻어오기 위해 DB를 추가로 조회합니다.
@Getter
@Setter
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
Member member = new Member();
em.persist();
System.out.println("board.id = " + member.getId());
em.persist()를 호출해서 엔티티를 저장한 직후 할당된 식별자 값을 출력했습니다.
출력된 값은 저장 시점에 DB가 생성 한 값을 JPA가 조회한 것입니다.
여기서 중요한 점이 있습니다.
IDENTITY전략은 DB에 INSERT한 후에 기본 키 값을 조회할 수 있습니다.
따라서 엔티티에 식별자 값을 할당하려면 JPA는 추가로 DB에 조회해야 합니다.
JDBC3에 추가된 Statement.getGeneratedKeys()를 사용하면 데이터를 저장하면서 동시에 생성된 기본 키 값도 얻어 올 수있습니다. 하이버네이트는 이 메소드를 사용해서 DB와 한번만 통신합니다.
엔티티가 영속 상태가 되려면 반드시 식별자가 필요합니다.
그런데 IDENTITY 식별자 생성 전략은 엔티티를 DB에 저장해야 식별자를 구할 수 있으므로 em.persist()를 호출하는 즉시 INSERT SQL이 DB에 전달됩니다. 따라서 이 전략은 트랜잭션을 지원하는 쓰기지연이 동작하지않습니다.
'IT > JPA' 카테고리의 다른 글
TABLE 전략 (0) | 2022.05.15 |
---|---|
SEQUENCE 전략 (0) | 2022.05.14 |
기본 키 직접 할당 전략 (0) | 2022.05.13 |
기본키 매핑 - 기본 키 생성 전략 (0) | 2022.05.11 |
DDL생성 기능 - 제약 조건, 유니크 제약 조건 (0) | 2022.05.10 |