• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

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

22.12.20 04:36 작성 22.12.20 04:38 수정 조회수 429

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님의 프로필

y2gcoder

2022.12.20

안녕하세요. 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

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

y2gcoder님의 프로필

y2gcoder

2022.12.22

파이팅입니다!