코드 그라데이션
벌크 연산 본문
벌크 연산 - 문제 상황
벌크 연산
벌크 연산 주의사항
예시,
지금 있는 모든 회원의 나이를 전체적으로 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
'Database > JPQL' 카테고리의 다른 글
Named 쿼리 (0) | 2023.09.03 |
---|---|
엔티티 직접 사용 (0) | 2023.09.03 |
JPQL - 다형성 쿼리 (0) | 2023.09.02 |
fetch join (페치 조인) (3) 페치 조인 vs 일반 조인, 페치 조인의 한계 (0) | 2023.09.02 |
fetch join (페치 조인) (2) 컬렉션 페치 조인, DISTINCT (0) | 2023.09.02 |
Comments