인프런 - 실전! 스프링 데이터 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);

 

+ Recent posts