[SpringBoot Querydsl : 수정, 삭제 배치 쿼리]

Han Gyul Kang·2022년 5월 5일
0

Inflern_Spring_Querydsl

목록 보기
6/7

> 벌크 연산

벌크 연산의 경우 영속성 컨텍스트를 무시하고 데이터베이스에 직접 실행
그렇기 때문에 영속성 컨텍스트와 데이터베이스 값이 서로 다를 경우가 발생

> 영속성 컨텍스트 우선권

벌크 연산 이후에 조회를 할 경우 영속성 컨텍스트에 데이터가 남아있다면
영속성 컨텍스트가 데이터베이스보다 우선이 됨
데이터베이스에는 업데이트 되었으나 조회 후 출력하는 값이 다르게 되는 문제 발생...

> 문제 해결

벌크 연산 이후에 무조건!!!
EntityManager의 flush, clear를 호출한다(=영속성 컨텍스트 초기화).

    public void bulkUpdate() {
        // count : 영향을 받은 건수
        // 1. 영속성 컨텍스트를 무시하고 실행되기 때문에 데이터베이스와 영속성 컨텍스트의 값이 다름
        long count = jpaQueryFactory
                .update(member)
                .set(member.username, "updatedName")
                .where(member.age.lt(28))
                .execute();

        // 3. 우선권에 대한 문제 해결 : EntityManager 초기화
        /**
         * 매우 중요
         */
        em.flush();
        em.clear();

        // 2. 우선권 : 영속성 컨텍스트 > 데이터베이스
        List<Member> result = jpaQueryFactory
                .selectFrom(member)
                .fetch();

        for(Member m : result) {
            System.out.println(m);
        }
    }

> 예제

github:gang6607

profile
피아노 치는 개발자

0개의 댓글