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

donkey님의 프로필 이미지
donkey

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

벌크 연산

벌크연산후 createQuery 작동방식 질문

작성

·

76

·

수정됨

0

강의 처럼 벌크 연산 후

int resultCount = em.createQuery("update Member m set m.age=20")
        .executeUpdate();

clear없이 바로 createQuery를 날리면,

Member result = em.createQuery("select m from Member m where m.id = :id", Member.class)
        .setParameter("id", member1.getId())
        .getSingleResult();
System.out.println("member.getAge() = " + result.getAge());

아래와 같은 select 쿼리가 날라가고 age가 원래값으로 나옵니다.
Hibernate:

/* select

m

from

Member m

where

m.id = :id */ select

m1_0.id,

m1_0.age,

m1_0.memberType,

m1_0.TEAM_ID,

m1_0.username

from

Member m1_0

where

m1_0.id=?

member.getAge() = 10
//////////////////////////////
find처럼 selcet문이 안날라갈줄 알았는데, 날라가서 createQuery 작동방식이 궁금합니다.
1.이 쿼리가 실제로 db에 날라갔는데,
age=20값을 가지고오면서 영속성 컨텍스트에 들렸는데,
이미 캐시가 존재해서, 쿼리 값을 업데이트 안해주고 원래값 age=10을 가지고 온건가요?
2. 아니면 로그에 보이는 쿼리가 실제 db 에 날라가지 않고 생성만된채로, 영속성 컨텍스트를 찾는건가요?

답변 1

0

안녕하세요. donkey님, 공식 서포터즈 y2gcoder입니다.

1번에서 하신 말씀이 맞습니다. JPQL을 을 통해 DB로 쿼리를 찌르기는 하나, 영속성 컨텍스트에 같은 식별자의 엔티티가 존재하기 때문에 DB에서 가져온 결과는 무시되는 것이라 이해해주시면 감사하겠습니다!

 

감사합니다.

donkey님의 프로필 이미지
donkey

작성한 질문수

질문하기