주의해야할 점
bulk연산을 수행하면, db와 영속성 컨텍스트의 값이 서로 다르다.
쿼리 수행 전
member1 = 10 → DB member1
member2 = 20 → DB member2
member3 = 30 → DB member3
member4 = 40 → DB member4
long execute = queryFactory
.update(member)
.set(member.username, "비회원")
.where(member.age.lt(28))
.execute();
쿼리 수행 후
member1 = 10 → DB 비회원
member2 = 20 → DB 비회원
member3 = 30 → DB member3
member4 = 40 → DB member4
queryFactory
.selectFrom(member)
.fetch();
DB에서 member 테이블의 값을 조회할 때, 해당 데이터가 영속성 컨텍스트에 이미 존재한다면, DB의 값은 영속성 컨텍스트의 값과 교체되지 않는다. 즉, DB보다 영속성 컨텍스트가 높은 우선권을 가진다. → 영속성 컨텍스트 데이터 유지
해결책
벌크 연산 이후에 아래 코드를 꼭 실행할 것.
em.flush();
em.clear();