728x90
JPA


- JPA의 더티 체크 기능을 사용하면, 단건 업데이트밖에 되지 않기 때문에 여러 건을 Update 하기 위해서는 벌크성 수정 쿼리를 동작시켜야 된다.
- 벌크 연산 같은 경우 조심해서 사용해야된다.(쿼리를 직접 동작)
SpringDataJpa


- 벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용
- 사용하지 않으면 다음 예외 발생
- org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations
- 벌크성 쿼리를 실행하고 나서 영속성 컨텍스트 초기화: @Modifying(clearAutomatically = true) (이 옵션의 기본값은 false )
- 벌크 연산을 진행 후 영속성 컨택스트와 DB을 데이터 정합성이 다를 수 있으므로 clear옵션을 설정해 주어야 한다.
- 이 옵션 없이 회원을 findById 로 다시 조회하면 영속성 컨텍스트에 과거 값이 남아서 문제가 될 수 있다. 만약 다시 조회해야 하면 꼭 영속성 컨텍스트를 초기화 하자
참고: 벌크 연산은 영속성 컨텍스트를 무시하고 실행하기 때문에, 영속성 컨텍스트에 있는 엔티티의 상태와 DB에 엔티티 상태가 달라질 수 있다.
권장하는 방안
1. 영속성 컨텍스트에 엔티티가 없는 상태에서 벌크 연산을 먼저 실행한다.
2. 부득이하게 영속성 컨텍스트에 엔티티가 있으면 벌크 연산 직후 영속성 컨텍스트를 초기화 한다.
728x90
'실전! 스프링 데이터 JPA' 카테고리의 다른 글
| Ch03. 쿼리 메소드 기능 - JPA Hint, Lock (0) | 2021.12.26 |
|---|---|
| Ch03. 쿼리 메소드 기능 - @EntityGraph (0) | 2021.12.26 |
| Ch03. 쿼리 메소드 기능 - SpringDataJPA 페이징과 정렬 (0) | 2021.12.26 |
| Ch03. 쿼리 메소드 기능 - 반환 타입 (0) | 2021.12.26 |
| Ch03. 쿼리 메소드 기능 - 파라미터 바인딩 (0) | 2021.12.26 |