벌크 연산
JPA 변경 감지로 공통된 값들을 조회하기엔 너무 벅차다. 또 변경된 데이터가 1000만 건이라면 1000만 건의 SQL을 실행해야한다.
이것을 해결하기 위한 연산이 벌크 연산이다.
쿼리 한 방으로 여러 테이블의 열 값을 변경할 수 있다.
예제
// Flush가 자동호출된다. commit, query 나갈때 자동으로 호출된다.
int resultCount = em.createQuery("update Member m set m.age = 20")
.executeUpdate();
모두 20살로 바뀐다. 파라미터 셋팅하면 개별로도 가능하다.
/*
재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면?
*/
String qlString = "update Product p " +
"set p.price = p.price * 1.1 " +
"where p.stockAmount < :stockAmount";
int resultCount = em.createQuery(qlString)
.setParameter("stockAmount", 10)
.executeUpdate();
주의
벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리를 날리기 때문에 영속성 컨텍스트에 들어있던 값과 정합성이 안맞을 수 있다.
이때는 그냥 벌크 연산을 수행하고, 영속성 컨텍스트를 초기화 시켜주면 된다.