미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA Persist 및 Commit 시 SQL 시점에 대한 질문
안녕하세요 강사님! 강의 너무 잘 수강하고 있는 학생입니다!
다름이 아니라 영속성 컨텍스트를 활용하여
em.persist(), tx.commit() 을 함에 따라 SQL 이 뿌려지는 시점 설명해주실 때 궁금증이 생겨서요! 우선 코드를 보시면
// 비영속JpaMember memberA = new JpaMember();memberA.setName("얄리얄라");JpaMember memberB = new JpaMember();memberA.setName("두둥실");// 영속화. 영컨에 등록 em.persist(memberA);em.persist(memberB);System.out.println("=================== before commit");memberA.setName("조지밀러"); trans.commit();System.out.println("=================== after commit");
위와 같은 코드를 진행하였을 시, ㅁㄴ다음과 같이 출력되고, SQL이 나가는 모습이 확인됩니다.
=================== before commit
Hibernate:
/* insert jpa.demo.domain.JpaMember
*/ insert
into
jpa_member
(name, id)
values
(?, ?)
Hibernate:
/* insert jpa.demo.domain.JpaMember
*/ insert
into
jpa_member
(name, id)
values
(?, ?)
Hibernate:
/* update
jpa.demo.domain.JpaMember */ update
jpa_member
set
name=?
where
id=?
=================== after commit
의문이 드는점은,
1. Insert SQL 이 쌓였다가 나간다고 말씀하셨는데 두개가 나가는 것 같아서요! 제가 SQL을 잘 몰라서 부정확할 수도 있는 것 같은데 왜 두 번 나가게 되는지 궁금합니다!
2. 또한 Persist 를 하는 시점에 아직 insert 문이 나가지 않았다면 DB에 따로 등록이 안되어 있는걸로 생각했습니다.
그렇다면 commit 하기 전 시점에 entity 값을 set 함수를 통해 변경하여 1차 캐시가 더티 체크를 통해 변경을 감지하면, 그냥 그 1차 캐시 내부에 있는 데이터만 바꿔주면 되는 것... 아닌가요..?! DB에 insert 문이 아직 나가지 않았는데 굳이 insert 문도 보낸 이후 update 문까지 내보내면서 수정이 진행되는 이유가 궁금합니다!!
강사님 강의 너무 잘 듣고 있습니다. 감사합니다!