• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

insert 순서 질문

18.09.25 03:52 작성 조회수 100

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가 발생합니다.

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