강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

wdvvgy님의 프로필 이미지
wdvvgy

작성한 질문수

스프링 데이터 JPA

JPA 프로그래밍 5. 엔티티 상태와 Cascade

insert 순서 질문

작성

·

171

0

mysql환경에서 account와 study entity에 대한 generated value를 auto(default)로 두면

sequence 기반으로 동작하는거같습니다.

그런데 @GeneratedValue(strategy = GenerationType.IDENTITY) 로 두면

auto_increment 기반으로 동작합니다.

위 두개의 설정이 아래의 코드 결과가 다르게 출력됩니다.

entityManager.persist(account);

entityManager.persist(study);

Account keesun = entityManager.find(Account.class, account.getId());

print(keesun.getUsername());

전자의 경우(sequence기반) 1차캐시에서 데이터를 가져오기때문에

print 가 먼저 찍히고 난후 insert query가 동작합니다.

후자의 경우(auto_increment기반) insert query가 먼저 실행된 후

print가 찍힙니다.

무슨 차이때문에 이런건가요?

답변 1

2

백기선님의 프로필 이미지
백기선
지식공유자

안녕하세요. 제가 컨퍼런스에 와서 답변이 좀 늦었습니다. 죄송해요~

우선, 시퀀스를 사용할 때 (아무 값도 안 줬을 경우)에는 insert 하기전에 hibernate_sequence라는걸 호출해서 미리 id 값이 뭐가 될지 알고 있고, 그 상태에서 username을 출력하고 마지막으로 트랜잭션 끝날 때 insert를 합니다.

그런데, identity로 설정한 경우에는 MySQL에 auto_increment 타입으로 설정이 되고, 그 경우에는 id를 알아내려면 DB에 저장할 수밖에 없기 때문에, (저장하는 순간에 자동으로 증거하는 id 값을 MySQL이 설정해주니까요.) persist 하는 순간(1차 캐시에 넣어두려면 id가 필요해서) insert가 발생합니다.

좋은 질문 주셔서 감사합니다.

wdvvgy님의 프로필 이미지
wdvvgy

작성한 질문수

질문하기