티스토리 뷰
반응형
|| 벌크 연산
--
- 여러 건(대량의 데이터)을 한 번에 수정하거나 삭제하는 방법
- 벌크 연산은 executeUpdate() 메소드 사용
- 영향을 받은 엔티티 건수 반환
c. (여러 건 수정) 재고가 10개 미만인 모든 상품의 가격을 10% 상승
1 2 3 4 5 6 7 8 | 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(); | cs |
c. (여러 건 삭제) 가격이 100원 미만인 상품 삭제
1 2 3 4 5 6 7 | String qlString = "delete from Product p" + "where p.price < :price"; int resultCount = em.createQuery(qlString) .setParameter("price", 100) .excuteUpdate(); | cs |
|| 주의점
--
- 벌크 연산은 영속성 컨텍스트와 2차 캐시를 무시하고 데이터베이스에 직접 쿼리한다는 점을 주의
- 조회 후 벌크 연산을 수행했을 경우,
영속성 컨텍스트에 있는 상품A와 데이터베이트에 있는 상품A의 가격이 다를 수 있음
(영속성 컨텍스트와 데이터베이스 간에 데이터 차이 발생)
||| 해결 방법
--
> em.refresh() 사용
- 벌크 연산 수행 직후 정확한 상품A 엔티티를 사용해야 한다면,
em.refresh(productA)를 사용하여 데이터베이스에서 상품A를 다시 조회
> 벌크 연산 먼저 실행
- 가장 실용적인 해결책
- JPA와 JDBC를 함께 사용할 때도 유용
> 벌크 연산 수행 후 영속성 컨텍스트 초기화
- 영속성 컨텍스트에 남아 있는 엔티티를 제거하는 방법
출처 : 자바 ORM 표준 JPA 프로그래밍
반응형
'Books' 카테고리의 다른 글
[Spring + JPA] Make Web Application (2) (0) | 2020.12.24 |
---|---|
[Spring + JPA] Make Web Application (1) (0) | 2020.12.23 |
[JPA] 네이티브 SQL 정리 (0) | 2020.12.23 |
[JPA] QueryDSL 정리 (0) | 2020.12.22 |
[JPA] JPQL Query 정리 (0) | 2020.12.22 |
댓글