프로그램을 짜다보면 배치작업처럼 다량의 데이터가 업데이트 되거나 삭제되야하는 경우가 있다.
그런데 querydsl로 update 쿼리를 날리면 db의 상태와 영속성 컨택스트의 상태가 다른것을 확인할 수 있다.
영속성 컨택스트의 데이터는 그대로고 db만 값이 변경된다.
영속성 컨택스트의 1차 캐시와 동기화가 안되었기 때문이다. (JPA에서는 이를 Dirty Checking) 이라고 한다.
그래서 혹시나 내부에서 로직이 update이외에 다른게 있다면 꼭 영속성 컨택스트를 초기화 하는 과정을 넣어주는게 좋다.
long updateCnt = queryFactory
.update(member)
.set(member.userName, "babo")
.set(member.age, member.age.add(1))
.execute();
//영속성 컨택스트 초기화
em.flush();
em.clear();
List<Member> members = queryFactory
.selectFrom(member)
.fetch();
위 로직은 업데이트 후 조회하는 로직이들어가서 중간에 영속성 컨택스트를 초기화 해주지 않으면 db만 바뀌고 값의 출력은 바뀌지 않은 값이 그대로 출력된다.
만약에 아래 코드처럼 그냥 다 삭제하고 (업데이트도 마찬가지) 그 이후에 아무 로직도 없다면 따로 초기화를 안해줘도 된다.
public void allDelete() {
long deleteCnt = queryFactory
.delete(member)
.execute();
}
끝
반응형
'Develop > Spring' 카테고리의 다른 글
[JPA] Entity의 4가지 상태 (0) | 2021.08.08 |
---|---|
Spring Boot 프로젝트에서 환경에 따라 다른 Profile 등록하기 (0) | 2021.07.09 |
[querydsl] 동적 쿼리 만들기 (0) | 2021.07.08 |
[querydsl] querydsl에서 projection 다루기 (0) | 2021.07.07 |
[querydsl] concat 사용법 (문자열 붙이기) (1) | 2021.07.07 |
댓글