인프런 커뮤니티 질문&답변

성실한 청어님의 프로필 이미지
성실한 청어

작성한 질문수

실전! Querydsl

벌크연산 관련 질문드립니다

작성

·

165

0

안녕하세요 강사님. 강의 듣다가 의문점이 하나 있어서 질문드립니다.

bulk update 후 동일 트랜잭션 내에서 엔티티를 조회했을때 영속성 컨텍스트에 update 결과가 반영안되는것까진 확인했습니다.

그런데 bulk delete 후에 엔티티를 조회하면 delete 결과가 반영이 되어있더라고요. (27강 12분 25초 delete문을 날린 후 Member 조회시 1개가 나옵니다)

그 이유가 궁금합니다. 결국 벌크연산에서 update문만 조심하면 되는건가요?

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. skaansxo1님

다음 코드를 주석을 보면서 돌려보시면 이해가 되실거에요.

    @Test
public void bulkDelete() {

long count = queryFactory
.delete(member)
.where(member.age.gt(20))
.execute();

assertThat(count).isEqualTo(2);

// em.flush();
// em.clear();

List<Member> result = queryFactory
.selectFrom(member)
.fetch();

assertThat(result.size()).isEqualTo(2); //4개를 기대했는데 2개만 조회
//JPQL을 사용하면 SQL을 실행해서 DB에 있는 데이터를 기준으로 조회
for (Member member1 : result) {
System.out.println("member1 = " + member1);
}

//하지만 회원 3,4는 영속성 컨텍스트에 아직 남아있음(위험함)
//em.find()로 조회하면 영속성 컨텍스트를 먼저 찾음
//따라서 delete 벌크 연산 후 em.clear()로 영속성 컨텍스트를 초기화 하는 것이 안전함
Member member3 = em.find(Member.class, member3Id);
assertThat(member3).isNotNull();

Member member4 = em.find(Member.class, member4Id);
assertThat(member4).isNotNull();

}

감사합니다.

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. skaansxo1님

뭔가 좀 이상하네요. 코드를 봐야할 것 같아요.

전체 프로젝트를 압축해서 올려주세요.

감사합니다.

 

성실한 청어님의 프로필 이미지
성실한 청어

작성한 질문수

질문하기