작성
·
112
·
수정됨
0
안녕하세요?
아래 코드에서 em.clear() 를 호출하거나 호출하지 않거나 모두 SQL 로그가 나옵니다 . SQL 로그가 나온다는 것은 DB에 갔다올 것 같은 생각이 드는데요, 그렇지만 em.clear()를 호출하지 않는 경우에는 age 가 0으로 출력되고, em.clear()를 호출하는 경우 20으로 출력됩니다. SQL Queury가 로그에 찍히더라도 영속성 컨텍스트에서 값을 조회하는 경우가 있는걸까요?
int resultCount = em.createQuery("update Member m set m.age = 20")
.executeUpdate();
System.out.println("resultCount = " + resultCount);
em.clear();
Member mm = em.createQuery("select m from Member m where m.name = :name", MemberJ.class)
.setParameter("name", "회원1")
.getSingleResult();
SQL 로그가 두 경우 모두 찍힘
Hibernate:
/* select
m
from
Member m
where
m.name = :name */ select
m1_0.id,
m1_0.age,
m1_0.name,
m1_0.TEAM_ID
from
MEMBER m1_0
where
m1_0.name=?
답변 2
1
안녕하세요. mikaaaaa님
em.find()와 같은 메서드를 사용하는 경우에는 영속성 컨텍스트를 먼저 조회하게 됩니다.
JPQL을 작성하는 경우 항상 SQL을 실행해서 엔티티를 조회하고, 만약 엔티티가 영속성 컨텍스트에 있다면 조회한 결과를 버리고, 영속성 컨텍스트에 없다면 새로운 엔티티를 영속성 컨텍스트에 등록합니다.
따라서 JPQL을 사용한 select 에서 항상 SQL이 실행되는 것은 맞습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. mikaaaaa님 질문 주셔서 감사합니다.
질문해 주신 내용은 JPA에서 벌크 연산과 영속성 컨텍스트의 관계에 대한 내용입니다. 벌크 연산을 사용하면 JPA는 데이터베이스에 직접 수정 쿼리를 실행하는데, 이 때 영속성 컨텍스트에 있는 엔티티들은 업데이트된 정보를 알지 못하게 됩니다. 그래서 em.clear()
를 호출하여 영속성 컨텍스트를 초기화하고 데이터를 다시 로드하면 데이터베이스의 최신 값이 반영됩니다.
두 경우 모두 SQL 로그가 나오지만, 영속성 컨텍스트의 상태에 따라 결과가 다르게 출력될 수 있습니다. em.clear()
가 없을 때는 영속성 컨텍스트에 여전히 기존 엔티티가 남아 있어서 이전 값을 출력하고, em.clear()
를 호출하면 새로운 값을 데이터베이스에서 가져오게 됩니다.
다음 URL에서 비슷한 문제와 답변에 대해 더 자세히 읽어 보실 수 있습니다:
위 설명과 URL들이 도움이 되셨기를 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.