반응형
JPA에서 영속성 콘텍스트에 있는 엔티티를 수정하기 위해선 영속성 콘텍스트의 변경 감지 기능이나 병합을 사용하고, 삭제하려면 엔티티 매니저의 remove()를 사용한다. 하지만 여러 개의 엔티티가 존재한다고 했을 때 하나씩 처리하기에는 오래 걸린다. 이럴 때 여러 건을 한 번에 수정하거나 삭제하는 벌크 연산을 사용한다.
벌크 연산은 메서드 체이닝 기준 마지막에. executeUpdate() 메서드를 사용한다. 반환 값은 벌크 연산의 영향을 받은 엔티티 수이다.
String qlString =
update Product p set p.price = p.price * 1.1 where p.stockAmount< 10;
int resultCount = em.createQuery(qlString)
.executeUpdate();
벌크 연산을 사용할 때는 벌크 연산이 영속성 콘텍스트를 무시하고 데이터베이스에 직접 쿼리 한다는 점을 숙지하자. 벌크 연산을 사용하면 영속성 컨텍스트의 엔티티 속성이 데이터베이스 테이블의 값과 달라질 수 있다.
이러한 문제를 해결하기 위한 여러 가지 방법이 존재한다.
1) em.refresh()사용 :
벌크 연산을 수행한 후 엔티티를 사용해야 한다면 다시 해당 엔티티를 조회해서 영속성 콘텍스트를 refresh()해주는 것이다.
2) 벌크 연산을 가장 먼저 수행:
가장 실용적이다 조회를 하기전 먼저 벌크 연산을 수행한 후 엔티티를 조회하면 문제없이 사용할 수 있다.
3) 벌크 연산 수행 후 영속성 콘텍스트 초기화:
벌크 연산을 수행한 직후 영속성 컨텍스트를 초기화해서 모든 엔티티를 제거한다. 그렇지 않으면 벌크 연산 전의 엔티티들을 사용할 경우 벌크 연산이 적용되지 않은 엔티티들을 사용할 수 있기에 초기화시키는 방법도 존재한다.
반응형
'데이터 접근 기술 > JPA' 카테고리의 다른 글
[JPA] 2차 캐시 (0) | 2021.04.17 |
---|---|
[JPA] JPA 기본 정리 (0) | 2021.04.11 |
[JPA] JPQL JOIN (0) | 2021.01.31 |
[JPA] JPQL 기본 문법과 SELECT 절 (0) | 2021.01.31 |
[JPA] JPQL 소개 (0) | 2021.01.30 |
댓글