코드 그라데이션

벌크 연산 본문

Database/JPQL

벌크 연산

완벽한 장면 2023. 9. 4. 00:50

벌크 연산 - 문제 상황

 

벌크 연산

 

 

벌크 연산 주의사항

 


예시,

지금 있는 모든 회원의 나이를 전체적으로 20세로 변경하기

JpqlMain

public class JpqlMain {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {
      Team teamA = new Team();
      teamA.setName("팀A");
      em.persist(teamA);

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

      Member member1 = new Member();
      member1.setUsername("회원1");
      member1.setTeam(teamA);
      em.persist(member1);

      Member member2 = new Member();
      member2.setUsername("회원2");
      member2.setTeam(teamA);
      em.persist(member2);

      Member member3 = new Member();
      member3.setUsername("회원3");
      member3.setTeam(teamB);
      em.persist(member3);


      em.flush();
      em.clear(); // 비움

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

      System.out.println("resultCount = " + resultCount);

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      e.printStackTrace();
    } finally {
      em.close();
    }
    emf.close();
  }
}

 

 

실행 결과

회원 3명 있었으므로, 세 명 모두의 나이가 20세로 변경됨을 확인할 수 있음.

 

왜 벌크 연산 수행 후 영속성 컨텍스트를 초기화 해야하냐면

//      em.flush();
//      em.clear(); // 비움

      int resultCount = em.createQuery("update Member m set m.age = 20")
          .executeUpdate();
      Member findMember = em.find(Member.class, member1.getId());
      System.out.println("findMember = " + findMember);
//      System.out.println("resultCount = " + resultCount);

이렇게 수정했을 때,

 

업데이트 쿼리는 날아갔는데(DB에는 반영),

여전히 나이 출력은 0으로 되고 있다.

 

그런데 이걸 삽입해주면

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

      em.clear(); // 여기
      
      Member findMember = em.find(Member.class, member1.getId());
      System.out.println("findMember = " + findMember);

 

 

반영 제대로 된 결과 확인 가능

 

길고 길었던 강의 완강.

728x90
Comments