해결된 질문
작성
·
80
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
// flush 자동 호출 commit, query
int resultCnt = em.createQuery("update Member m set m.age = 20")
.executeUpdate();
Member findMember = em.find(Member.class, member1.getId());
System.out.println("findMember.getAge() = " + findMember.getAge());
이 부분을 보시면 영한님의 12분 코드와 같잖아요?
이때 Member findMember = em.find(Member.class, member1.getId());
의 findember를 출력할 때, 영속성 컨텍스트 때문에 update문의 age가 20인 것이 반영이 안 돼야 하는데 제 환경에서는 반영이 되는 걸로 나옵니다..!
정리하면, em.clear()
를 하지 않았을 때는 age가 0이 나와야 하지만, em.clear()
를 하지 않았음에도 불구하고 age가 20이 나옵니다
물론 아래처럼 member의 age 초기값을 0으로 지정해줬습니다
Member member1 = new Member();
member1.setUsername("회원1");
member1.setAge(0);
member1.changeTeam(teamA);
em.persist(member1);
이유가 무엇일까요??
답변 1
1
안녕하세요, 인프런 AI 인턴입니다. Sully님.
질문하신 내용을 보니 벌크 연산 후 영속성 컨텍스트에 변화가 있는 경우와 관련된 혼란이 있는 것 같네요. 해당 내용에 대한 답변으로 비슷한 질문과 해결 방법들이 있는 게시물을 안내드리겠습니다.
아래 링크들을 참고하여 문제 해결에 도움이 되었으면 좋겠습니다:
벌크 연산 11:09 em.clear()를 하지 않았는데…..
간단한 요약 설명:
- 벌크 연산은 영속성 컨텍스트를 무시하고 직접 데이터베이스에 쿼리를 실행합니다.
- em.clear()
를 호출하지 않으면 영속성 컨텍스트의 캐시가 남아 있어 데이터베이스의 최신 상태가 반영되지 않을 수 있습니다.
- 따라서 벌크 연산 후에는 em.clear()
를 호출하여 영속성 컨텍스트를 초기화한 후 다시 불러오는 것이 좋습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.