IDENTITY 전략에서 1차 캐시에 entity가 저장되는 시점은 언제인가요?
4.6.2 IDENTITY 키 생성 전략에서 1차 캐시에 저장할 때는 기본키가 반드시 필요하기 때문에 em.persist()를 호출하는 시점에 바로 DB에 INSERT SQL 이 실행된다고 적혀있습니다.
그리고 Statement.getGeneratedKeys()를 사용해서 데이터 저장과 동시에 기본 키값을 얻어올 수 있습니다.
그렇다면, 1차 캐시에는 DB에 INSERT SQL이 실행된 직후 entity가 저장되는건가요?
아니면, em.find()를 하는 시점에 1차 캐시에 entity가 저장되는 걸까요?
아래 사진에서 왼쪽일까요, 오른쪽일까요?

답변 2
0
안녕하세요. 지니쿠키곰님, 공식 서포터즈 David입니다.
엔터티가 1차 캐시에 저장되는 시점을 질문하실걸로 이해했습니다
persist(member) 하게 되면, 먼저 1차캐시에 저장하고, 쿼리를 보내게 됩니다.
감사합니다.
0
일반적인 경우는 그렇지만, 책 4.6.2에 IDENTITY 전략의 경우 엔티티에 id가 없기 때문에 바로 1차 캐시에 저장하지 못한다고 나와있습니다. 그래서 바로 SQL을 날린다고 나와있습니다. 이 경우 1차 캐시에 저장되는 시점에 대한 질문입니다.
감사합니다.
1
답변이 늦어져 죄송합니다.
Id를 얻기 위해 쿼리를 날리고 Id를 얻은 직후 1차 캐시에 저장됩니다.
아래 코드는 Id를 얻기 위해 execute(): 쿼리 실행 후 엔터티를 저장하는 메서드를 호출하는 라인입니다.
0
@Test
@DisplayName("JPA IDENTITY 1차 캐시 저장시점 테스트")
void saveFistLevelCache() {
Review review = Review
.builder()
.stars(5)
.content("아무거나 리뷰 내용")
.build();
em.persist(review); // 이 시점에 Review 객체에 id가 세팅된다!
System.out.println("리뷰 아이디: " + review.getReviewId());
}
위의 코드로 테스트를 해보니 em.persist끝나자마자 Review객체에 ID가 세팅되는것을 확인했습니다.
위의 그림처럼 되나요?
1. em.persist(); -> 영속성 컨텍스트에 entity 등록
2. DB에 INSERT SQL실행
3. ID를 가져와서 영속성 컨텍스트의 entity에 ID 세팅
4. 1차 캐시에 entity 저장
영속성 컨텍스트와 애플리케이션 레벨의 entity는 주소가 같기 때문에 애플리케이션 레벨에서 바로 Id를 사용할 수 있는건가요?
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
15
2
inheritance startegy 선택시 고려사항
0
21
1
Entity 동등성 비교
0
18
1
실무 조언 관련 질문입니다.
0
44
1
H2데이터베이스 파일 생성
0
55
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
52
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
51
1
JPQL 메소드와 락
0
55
1
Delivery @OneToOne
0
60
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
92
2
UnsupportedOperationException 발생
0
85
3
H2 Database 연결이 안됩니다.
0
92
2
연관관계 매핑 질문드립니다.
0
85
2
h2데이터베이스 실행오류
0
107
2
persistence.xml
0
106
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
80
1
영속성 컨텍스트
0
64
1
JPA 프록시
0
94
1
Native Query와 MyBatis
0
67
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
85
1
임베디드 타입 예시 코드 관련 질문
0
114
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
94
3
인텔리제이 패키지 커서 단축키 질문
0
108
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
142
1





