BE전문가 프로젝트

JPQL 벌크 연산 본문

JPA

JPQL 벌크 연산

원호보고서 2022. 11. 10. 23:12

- 재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면?

 

- JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행

 `1. 재고가 10개 미만인 상품을 리스트로 조회한다.

  2. 상품 엔티티의 가격을 10% 증가한다.

  3. 트랜잭션 커밋 시점에 변경감지가 동작한다.

 

- 변경된 데이터가 100건이라면 100번의 Update SQL 실행

 

벌크 연산은 한번에 UPDATE, DELETE, INSERT(하이버네이트)  한 번에 여러가지 동작을 실행하는 것이다

 

 

벌크 연산 예제

  • 쿼리 한 번으로 여러 테이블 로우 변경(엔티티)
  • executeUpdate()의 결과는 영향을 받은 엔티티 수 반환
  • UPDATE, DELETE 지원
  • INSERT(insert into ... select. 하이버네이트 지원
Member member1 = new Member();
member1.setUsername("member1");
member1.setTeam(teamA);
em.persist(member1);

Member member2 = new Member();
member2.setUsername("member2");
member2.setTeam(teamA);
em.persist(member2);

Member member3 = new Member();
member3.setUsername("member3");
member3.setTeam(teamB);
em.persist(member3);


int resultCount = em.createQuery("update Member m set m.age =20")
			.executeUpdate();

 

 

벌크 연산 주의

벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리

  • 방법1: 벌크 연산을 먼저 실행
  • 방법2: 벌크 연산 수행 후 영속성 컨텍스트 초기화

벌크연산으로 update및 insert를 하게되면 입력된 데이터들은 영속성 컨텍스트가 아닌 단순히 DB의 데이터만 바꾸는 것이다. 따라서 이후에 find로 데이터를 가져오게 되면 1차 캐시에 있는 정보를 가져오기 때문에 변경된 데이터의 값을 한 트렌잭션 안에서는 얻을 수 없다. 따라서 영속성 컨텍스트를 초기화(clear()) 하여 1차 캐시 및 영속성 컨텍스트를 초기화 하여 다시 DB에서 데이터를 가져오도록 한다,

'JPA' 카테고리의 다른 글

Named쿼리  (0) 2022.11.10
엔티티 직접 사용  (0) 2022.11.10
다형성 쿼리  (0) 2022.11.10
페치조인의 한계  (0) 2022.11.09
JPQL - 페치 조인(fetch join)  (0) 2022.11.08
Comments