1. 벌크 연산
- 엔티티를 수정하려면 영속성 컨텍스트의 변경 감지 기능이나 병합을 사용하고, 삭제하려면 EntityManage.remove() 메서드를 사용한다.
- 하지만 이 방법으로 수백개 이상의 엔티티를 하나씩 처리하기에는 시간이 너무 오래 걸린다.
- 여러 건을 한 번에 수정하거나 삭제하는 벌크 연산을 사용한다.
//모든 멤버의 나이를 20으로 수정한다.
int resultCount = em.createQuery("update Member m set m.age = 20")
.executeUpdate();
//10살 이상의 멤버를 모두 삭제한다.
int resultCount = em.createQuery("delete from Member m where m.age > 10")
.executeUpdate();
- executeUpdate() 메서드를 사용하여 벌크 연산을 한다.
- 벌크 연산으로 영향을 받은 엔티티 건수를 반환한다.
2. 벌크 연산의 주의점
- 벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리 한다.
- 영속성 컨텍스트에 있는 상품A와 데이터베이스에 있는 상품A의 가격이 다를 수 있다.
- 벌크 연산을 주의해서 사용해야 한다.
3. 문제 해결 방법
(1) em.refresh() 사용
- 벌크 연산을 수행한 직후에 정확한 상품A 엔티티를 사용해야 한다면 em.refresh()를 사용해서 데이터베이스에서 상품A를 다시 조회하면 된다.
(2) 벌크 연산 먼저 실행
- 벌크 연산을 가장 먼저 실행하는 것이다.
- 벌크 연산을 먼저 실행하고 나서 상품A를 조회하면 벌크 연산으로 이미 변경된 상품A를 조회하게 된다.
- JPA와 JDBC를 함께 사용할 때 유용하다.
(3) 벌크 연산 수행 후 영속성 컨텍스트 초기화
- 벌크 연산을 수행한 직후에 바로 영속성 컨텍스트를 초기화해서 영속성 컨텍스트에 남아 있는 엔티티를 제거한다.
반응형
'JPA > JPA' 카테고리의 다른 글
[JPA] JPQL - Named 쿼리 (정적 쿼리) (0) | 2022.01.08 |
---|---|
[JPA] JPQL - 조건식 (0) | 2022.01.08 |
[JPA] JPQL - 경로 표현식(Path Expression)과 묵시적 조인 (0) | 2022.01.07 |
[JPA] JPQL - 페치 조인(Fetch Join) (0) | 2022.01.07 |
[JPA] JPQL - 조인(Join) (0) | 2022.01.07 |
댓글