2월 20일 JPA JPQL- 벌크연산
JPQL- 별크연산
-재고가 10개 미만인 모든 상품의 가격을 10%인상한다면?
-JPA변경감지 기능으로 실행하려면 너무많은 SQL의 update문이 발생
ㄴ1.재고가 10개 미만인 상품을 리스트로 조회한다
ㄴ2.상품 엔티티의 가격을 10%증가한다.
ㄴ3.트랜잭션 커밋 시점에 변경감지가 동작한다.
-변경된 데이터가 100건 이라면 100번의 update SQL을 실행한다.
벌크 = 1건씩 insert/update 하는것을 제외한 모든 insert / update 문
벌크연산 = 쿼리한번으로 같은 내용을 모두 적용
-쿼리 한번으로 여러 테이블 모두 변경(엔티티)
-executeUpdate()의 결과는 영향받는 엔티티수 반환
-Update , Delete 지원
-Insert(insert into ... select , 하이버네이트 지원)
ex) 벌크 후
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(); //이 단계에서 벌크연산을 명령
//특별히 다른게 아니라 1건의 SQL 이 다수에 적용되는 SQL을 말한다.
벌크연산 주의 (잘못 사용하면 꼬인다 . 벌크먼저 그 후 영속성 초기화)
-벌크연산은 영속성 컨텍스트를 무시하고 데이터 베이스에 직전쿼리
-벌크 연산을 먼저 실행
-벌크 연산 수행 후 영속성 컨텍스트 초기화
-벌크 실행직전 자동 flush된다. (SQL이 실행되기 때문)
-벌크만 실행되면 그 결과가 영속성이 되지 않기 떄문에 DB에 반영되지만 JPA영속성에는 반영되지 않기 때문에
flush가 필요하다.
벌크 순서
1.벌크 실행시 flush
2.벌크 값이 DB에만 반형 , JPA에는 미반영
3.일단 JPA 영속성 clear // 초기화
4.영속성 값을 db에서 다시 가져와서 1차캐시 채우기.