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

ightprove님의 프로필 이미지

작성한 질문수

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

벌크 연산

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

해결된 질문

22.12.20 04:36 작성

·

504

·

수정됨

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

Team teamA = new Team();
teamA.setName("teamA");
em.persist(teamA);
Team teamB = new Team();
teamB.setName("teamB");
em.persist(teamB);

Member member1 = new Member();
member1.setUsername("member1");
member1.setAge(10);
member1.changeTeam(teamA);
em.persist(member1);
Member member2 = new Member();
member2.setUsername("member2");
member2.setAge(20);
member2.changeTeam(teamA);
em.persist(member2);
Member member3 = new Member();
member3.setUsername("member3");
member3.setAge(30);
member3.changeTeam(teamB);
em.persist(member3);

em.flush();
em.clear();

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

Member findMember = em.find(Member.class, member1.getId());
System.out.println("findMember.getAge() = " + findMember.getAge());

em.clear()를 하지 않으면 10이 나와야 할거 같은데 100이 변경된게 영속성 컨텍스트에 반영이 된거 처럼 나오는데.

스펙이 바뀐걸까요? 아니면 제가 뭘 잘 못한걸까요?

https://drive.google.com/file/d/1qzmIqCOXOeCdy5McL0_RzcbugxbmdyMV/view?usp=share_link

답변 1

1

y2gcoder님의 프로필 이미지

2022. 12. 20. 12:23

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

em.flush();
em.clear();

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

Member findMember = em.find(Member.class, member1.getId());

해당 부분을 보시면

  1. 영속성 컨텍스트 초기화

  2. (영속성 컨텍스트가 초기화된 상태) 벌크 연산

  3. (벌크 연산은 영속성 컨텍스트를 무시하기 때문에 여전히 영속성 컨텍스트는 초기화되어있는 상태에서) find() 메서드를 통해 다시 영속성 컨텍스트로 불러오는 작업을 해주고 있기 때문에

영속성 컨텍스트에 벌크 연산의 결과가 반영된 상태로 오고 있습니다 :)

 


감사합니다.

ightprove님의 프로필 이미지
ightprove
질문자

2022. 12. 20. 12:47

아이고 위에 clear를 했었는데 밑에만 쳐다보다가 몰라봤네요. 등잔 위가 어둡군요....

y2gcoder님의 프로필 이미지

2022. 12. 22. 11:15

파이팅입니다!