JAVA

[JAVA] 벌크성 수정 쿼리와 @EntityGraph

응디 2022. 2. 23. 17:26

Bulk

벌크(bulk) 연산은 중간에 update 쿼리를 날려버린다.( 영속성 컨텍스트 모르게 ) ,

따라서 벌크연산을 진행하면 DB에는 반영이 되어있지만 영속성 컨텍스트에는 반영이 되어있지 X

그래서 벌크연산 후 영속성 컨텍스트를 clear 해주지 않으면 업데이트 되지 않은 값이 출력된다.

→ 매우 불편!!

 

이때 매번 clear를 해줄 수 없으니까 annotation을 사용해보자! → @Modifying

벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용한다.

사용하지 않으면 예외 발생(Not supported for DML operations....)

벌크연산을 사용해도 fetch와 똑같이 한방쿼리가 실행됨

 

// 벌크연산 사용
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);

// fetch join 사용
@Query("select m from Member m join fetch m.team")
List<Member> findMemberFetchJoin();

@EntityGraph

연관된 엔티티 SQL 한번에 조회 → fetch 비슷

jpql 안쓰고 fetch join을 사용하려면 EntityGraph 쓰면된다.

@Override
@EntityGraph(attributePaths={"team"}) // jpql 안쓰고 fetch join을 하려면 EntityGraph 쓰면됨
List<Member> findAll();

@EntityGraph(attributePaths={"team"}) // jpql 도 쓰고 EntityGraph도 쓰고싶다면? -> jpql에서 fetch join 만 빼면됨
@Query("select m from Member m")
List<Member> findMemberEntityGraph();

//    @EntityGraph(attributePaths = ("team"))
@EntityGraph("Member.all")  //Member의 NamedEntity가 실행이 됨
List<Member> findEntityGraphByUsername(@Param("username") String username);

'JAVA' 카테고리의 다른 글

[JAVA] web 확장 - 페이징과 정렬  (0) 2022.03.03
[JAVA] Auditing  (0) 2022.02.24
[JAVA] Spring data JPA 페이징과 정렬  (1) 2022.02.17
[JAVA] return type(Optional)  (0) 2022.02.16
[JAVA] @Query에서 DTO로 조회하기  (0) 2022.02.15