일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 추후정리
- EC2
- 네이티브쿼리
- appspec
- foreignkey
- 참조키
- application.yml
- 2 > /dev/null
- 예약
- ㅔㄴ션
- ubuntu
- subquery
- 테스트
- MySQL
- appspec.yml
- 커밋메세지수정
- docker명령어
- 포트
- 외부키
- AuthenticationEntryPoint
- 테스트메소드
- 메소드명
- 서브쿼리
- 적용우선순위
- 컨테이너실행
- 메세지수정
- 검색
- querydsl
- Query
- WeNews
Archives
- Today
- Total
제뉴어리의 모든것
[JPA] 기본키 생성 전략 IDENTITY, SEQUENCE 의 차이 본문
IDENTITY VS SEQUENCE
IDENTITY 전략은 먼저 Entity를 DB에 저장한 후에,
식별자를 조회해 Entity의 식별자로 할당하는 전략이다.
SEQUENCE 전략은 em.persist() 호출 전에 먼저 DB Sequence를 먼저 조회한다.
그 후 조회한 식별자를 Entity에 할당한 후 Entity를 영속상태로 저장한다.
그 후 Transaction을 Commit하여 Flush가 발생할 때 해당 Entity를 DB에 저장한다.
기본적으로 영속성 컨텍스트에 엔티티가 영속되기 위해선 ID값이 필요하다. 그런데 Insert 될 데이터는 아직 ID 값이 존재하지 않는다.
이런 상황에서 IDENTITY는 우선 엔티티의 내용을 repository의 save() 메소드 실행시점에 DB로 바로 Insert를 날린다.
그리고 Insert를 날리고 할당 된 ID값을 애플리케이션의 영속성 컨텍스트 안에 있는 엔티티에 ID 값을 할당한다.
즉, @Transactional로 인해 트랜잭션이 만들어졌음에도 flush가 트랜잭션 종료 시점이 아니라 save() 메소드 호출 할때이다.
그러나 SEQUENCE는 엔티티를 영속성 컨텍스트에 영속(persist()) 시키기 전에 DB에게 이번에 데이터가 Insert 될 경우 할당 될 ID 값이 무엇인지 호출한다. 그리고 해당 값을 리턴 받고 그 ID 값을 엔티티에 할당 한 후 영속성 컨텍스트에 그제서야 엔티티를 영속시킨다. 그리고 트랜잭션이 종료 될때, 그제서야 실제 Insert 쿼리를 날리고 flush를 한다.
출처 :
'Spring Boot > JPA' 카테고리의 다른 글
Spring Data JPA 쿼리 메소드 간단 정리 (0) | 2024.05.08 |
---|---|
태그 (Tag) 를 사용한 게시물 검색과 네이티브 쿼리 페이지네이션 (0) | 2022.11.07 |
JPA 쿼리 로그 출력 (0) | 2022.11.06 |
Jpa 사용시 Entity간에 연관관계에 따른 Fetch의 기본값 (0) | 2022.10.13 |
JPA Auditing (0) | 2022.09.04 |