spring data jpa : @EntityGraph

This commit is contained in:
haerong22
2021-09-02 00:09:36 +09:00
parent db2fd7183f
commit c610ca4568
3 changed files with 53 additions and 0 deletions

View File

@@ -12,6 +12,7 @@ import javax.persistence.*;
name="Member.findByUsername",
query="select m from Member m where m.username = :username"
)
@NamedEntityGraph(name = "Member.all", attributeNodes = @NamedAttributeNode("team"))
public class Member {
@Id @GeneratedValue

View File

@@ -5,6 +5,7 @@ import com.example.springdatajpa.entity.Member;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
@@ -47,4 +48,19 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
@Query("select m from Member m left join fetch m.team")
List<Member> findMemberFetchJoin();
@Override
// @EntityGraph(attributePaths = {"team"})
List<Member> findAll();
@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();
// @EntityGraph(attributePaths = {"team"})
@EntityGraph("Member.all")
List<Member> findEntityGraphByUsername(@Param("username") String username);
}

View File

@@ -243,5 +243,41 @@ public class MemberRepositoryTest {
// then
assertEquals(3, resultCount);
}
@Test
void findMemberLazy() {
// given
// member1 -> teamA
// member2 -> teamB
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
teamRepository.save(teamA);
teamRepository.save(teamB);
Member member1 = new Member("member1", 10, teamA);
Member member2 = new Member("member2", 10, teamB);
memberRepository.save(member1);
memberRepository.save(member2);
em.flush();
em.clear();
// when
List<Member> members = memberRepository.findAll();
members.forEach(member -> {
System.out.println("member.getUsername() = " + member.getUsername());
System.out.println("member.getTeam().getClass() = " + member.getTeam().getClass()); // Lazy 로딩 이므로 프록시 객체
System.out.println("member.getTeam().getName() = " + member.getTeam().getName()); // 이때 실제로 team 데이터 조회 ( N + 1 문제 발생 )
});
// fetch join 으로 해결 -> 한 번에 team 데이터도 모두 조회
// @EntityGraph(attributePaths = {"team"}) 사용 가능
List<Member> memberFetchJoin = memberRepository.findMemberFetchJoin();
memberFetchJoin.forEach(member -> {
System.out.println("member.getUsername() = " + member.getUsername());
System.out.println("member.getTeam().getClass() = " + member.getTeam().getClass());
System.out.println("member.getTeam().getName() = " + member.getTeam().getName()); // fetch join
});
}
}