인프런 - 실전! 스프링 데이터 JPA
순수 JPA
- executeUpdate() 사용
- 테스트
스프링 데이터 JPA
- 순수 jpa의 executeUpdate()대신 @Modifying 어노테이션 사용
- 테스트
문제점
- 영속성 컨텍스트와 벌크 업데이트간 충돌
@Test
public void bulkUpdate() {
memberRepository.save(new Member("member1", 10));
memberRepository.save(new Member("member2", 19));
memberRepository.save(new Member("member3", 20));
memberRepository.save(new Member("member4", 21));
memberRepository.save(new Member("member5", 22));
int resultCount = memberRepository.bulkAgePlus(20);
List<Member> result = memberRepository.findByUsername("member5");
Member member5 = result.get(0);
System.out.println("member5 = " + member5);
}
findByUsername 으로 member5 조회 시, 업데이트 전 데이터인 22가 출력됨.
해결방안
- 벌크 연산 이후에는 영속성 컨텍스트를 날리자
@Test
public void bulkUpdate() {
int resultCount = memberRepository.bulkAgePlus(20);
em.flush();
em.clear();
List<Member> result = memberRepository.findByUsername("member5");
Member member5 = result.get(0);
System.out.println("member5 = " + member5);
}
- @Modeifying(clearAutomatically = true) 어노테이션 옵션 추가
@Modifying(clearAutomatically = true)
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
'Back-end > Spring Data Jpa' 카테고리의 다른 글
쿼리 메소드 기능 - JPA Hint & Lock (0) | 2021.06.07 |
---|---|
쿼리 메소드 기능 - @EntityGraph (0) | 2021.06.07 |
쿼리 메소드 기능 - 페이징 (0) | 2021.06.07 |
쿼리 메소드 기능 - 파라미터 바인딩 & 반환타입 (0) | 2021.06.07 |
쿼리 메소드 기능 - @Query (0) | 2021.06.07 |