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

Sully님의 프로필 이미지
Sully

작성한 질문수

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

벌크 연산

혹시 이 부분은 강의 찍을 때와는 다르게 현재 바뀐 걸까요?

해결된 질문

작성

·

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님.

질문하신 내용을 보니 벌크 연산 후 영속성 컨텍스트에 변화가 있는 경우와 관련된 혼란이 있는 것 같네요. 해당 내용에 대한 답변으로 비슷한 질문과 해결 방법들이 있는 게시물을 안내드리겠습니다.

아래 링크들을 참고하여 문제 해결에 도움이 되었으면 좋겠습니다:

  1. 벌크 연산 11:09 em.clear()를 하지 않았는데…..

    • 이 게시물에서는 영속성 컨텍스트 초기화와 벌크 연산 후의 상태에 대해 설명하고 있습니다.
  2. flush commit 이해가 안되는부분이있습니다.

    • 여기서는 flush와 commit의 차이점과 역할에 대해 설명하고 있어 도움이 될 수 있습니다.
  3. 벌크연산후 createQuery 작동방식 질문

    • 벌크 연산 후 select 쿼리의 동작 방식에 대한 내용이고, 웬디님 질문과 유사한 상황을 다룹니다.
  4. 벌크연산 영속성 컨텍스트 관련

    • 벌크 연산 후 영속성 컨텍스트 초기화에 대한 내용입니다.

간단한 요약 설명:
- 벌크 연산은 영속성 컨텍스트를 무시하고 직접 데이터베이스에 쿼리를 실행합니다.
- em.clear()를 호출하지 않으면 영속성 컨텍스트의 캐시가 남아 있어 데이터베이스의 최신 상태가 반영되지 않을 수 있습니다.
- 따라서 벌크 연산 후에는 em.clear()를 호출하여 영속성 컨텍스트를 초기화한 후 다시 불러오는 것이 좋습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Sully님의 프로필 이미지
Sully

작성한 질문수

질문하기