insert 순서 질문
173
작성한 질문수 2
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가 발생합니다.
좋은 질문 주셔서 감사합니다.
spring boot 2.7.13-SNAPSHOT trace 소문자 로그 안나옴
0
533
1
<스프링 데이터 Common: 기본 리포지토리 커스터마이징> 에 대한 질문
0
392
1
comment table에서 저장될떄 왜 id값이 2부터저장이되는건가요?
0
407
1
@EnableJpaRepositories 설정을 스프링부트가 어디에서 자동설정하나요?
0
451
0
PersistenceContext 관련 질문드립니다.
0
335
1
지금(Eager), 나중에(Lazy)의 의미를 모르겠습니다
0
338
1
transaction 구간이 길어질 경우의 처리방법 문의드립니다.
0
905
1
docker postgres
0
293
1
Multiple DataSource 사용 시 transaction 관련 질문 드립니다.
0
2908
1
entity 중 null이 아닌 필드만 update 할 방법이 있을까요?
0
1191
1
Eager 모드일 경우, join을 inner join으로 바꾸는 법이 있을까요?
0
385
1
엔티티를 상속받는 DTO가 일반적인가요?
1
1847
1
커스텀 타입 클래스를 String 타입 처럼 이용해 쿼리하는 방법에 대해 질문하고 싶습니다.
0
339
1
연관관계 매핑 어떤식으로 해야될지 감이 안잡힙니다.
0
566
4
EntityManager 주입시 Annotation관련 질문드립니다.
0
565
1
클래스 기반 프로젝션 사용 관련 질문
0
560
1
save 메서드 질문드립니다.
0
258
1
복잡한 통계쿼리도 JPA로 가능한가요?
2
5593
1
find 와 get의 차이가 무엇인가요?
0
890
1
실무에서 JPA 할 때 FK로 개발할때 연관관계를 꼭 맺어주어야 하나요?
0
999
1
\dt Did not find any relations.
0
481
1
소스코드는 어디서 볼 수 있을까요?
1
287
1
table 생성과 select 문에 대한 질문
0
174
1
스프링 데이터 RepositoryTest 관련 질문
0
2173
2





