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 |