-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
insert 순서 질문
18.09.25 03:52 작성 조회수 109
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가 찍힙니다.
무슨 차이때문에 이런건가요?
답변을 작성해보세요.
2
백기선
지식공유자2018.09.27
안녕하세요. 제가 컨퍼런스에 와서 답변이 좀 늦었습니다. 죄송해요~
우선, 시퀀스를 사용할 때 (아무 값도 안 줬을 경우)에는 insert 하기전에 hibernate_sequence라는걸 호출해서 미리 id 값이 뭐가 될지 알고 있고, 그 상태에서 username을 출력하고 마지막으로 트랜잭션 끝날 때 insert를 합니다.
그런데, identity로 설정한 경우에는 MySQL에 auto_increment 타입으로 설정이 되고, 그 경우에는 id를 알아내려면 DB에 저장할 수밖에 없기 때문에, (저장하는 순간에 자동으로 증거하는 id 값을 MySQL이 설정해주니까요.) persist 하는 순간(1차 캐시에 넣어두려면 id가 필요해서) insert가 발생합니다.
좋은 질문 주셔서 감사합니다.
답변 1