JPA JPQL Bulk Operation(벌크 연산)

KMS·2022년 4월 12일
0

JPA Basics

목록 보기
20/20
			String query = "update Member m set m.age=20";
            int resultCount = em.createQuery(query)
                    .executeUpdate();
            System.out.println("resultCount = " + resultCount);

            Member findMemberBefore = em.find(Member.class, memberA.getId());
            System.out.println("memberA.getAge().before.em.clear() = " + findMemberBefore.getAge()); //memberA.age == 30
            em.clear(); //영속성 컨텍스트 초기화
            Member findMemberAfter = em.find(Member.class, memberA.getId());
            System.out.println("memberA.getAge().after.em.clear() = " + findMemberAfter.getAge()); //memberA.age == 20

벌크 연산 시, 한번 flush()를 한 후, DB에 바로 벌크 연산을 실행합니다.
그러므로, 해당 예제에서는 executeUpdate() 시 update SQL문이 실행돼서 DB에서는 모든 Member의 age가 20으로 수정됩니다.
그러나, 영속성 컨텍스트는 무시하고 바로 DB에 직접 update 하기 때문에, 영속성 컨텍스트에서는 update 전의 age로 설정되어 있습니다(memberA.age == 30 && memberB.age == 25).
그렇기 때문에, 벌크 연산 실행 후, 영속성 컨텍스트를 초기화 해줘야 합니다.

profile
Student at Sejong University Department of Software

0개의 댓글