EAGER : 해당 엔터티 조회 시 연관된 엔터티의 데이터를 같이 가져온다. 즉시 로딩
LAZY : 해당 엔터티 조회 후 연관 엔터티 접근 시 데이터 가져온다. 지연 로딩
List<Member> findMember = em.createQuery("select m from Member m", Member.class)
.getResultList();
for (Member member : findMember) {
System.out.println("member name : "+member.getName()+" member.getTeam "+member.getTeam().getName());
}
EAGER
Hibernate:
select
member0_.member_id as member_i1_4_,
member0_.city as city2_4_,
member0_.name as name3_4_,
member0_.team_id as team_id4_4_
from
member member0_
Hibernate:
select
team0_.team_id as team_id1_7_0_,
team0_.name as name2_7_0_
from
team team0_
where
team0_.team_id=?
Hibernate:
select
team0_.team_id as team_id1_7_0_,
team0_.name as name2_7_0_
from
team team0_
where
team0_.team_id=?
member name : member1 member.getTeam team1
member name : member2 member.getTeam team2
member name : member3 member.getTeam team1
LAZY
Hibernate:
select
member0_.member_id as member_i1_4_,
member0_.city as city2_4_,
member0_.name as name3_4_,
member0_.team_id as team_id4_4_
from
member member0_
Hibernate:
select
team0_.team_id as team_id1_7_0_,
team0_.name as name2_7_0_
from
team team0_
where
team0_.team_id=?
member name : member1 member.getTeam team1
Hibernate:
select
team0_.team_id as team_id1_7_0_,
team0_.name as name2_7_0_
from
team team0_
where
team0_.team_id=?
member name : member2 member.getTeam team2
member name : member3 member.getTeam team1
쿼리는 하나 실행했는데 연관관계로 인해 여러 개의 쿼리가 실행
성능 저하
List<Member> findMember = em.createQuery("select m from Member m join fetch m.team", Member.class)
.getResultList();
for (Member member : findMember) {
System.out.println("member name : "+member.getName()+" member.getTeam "+member.getTeam().getName());
}
결과
하나의 쿼리만 실행된다
Hibernate:
select
member0_.member_id as member_i1_4_0_,
team1_.team_id as team_id1_7_1_,
member0_.city as city2_4_0_,
member0_.name as name3_4_0_,
member0_.team_id as team_id4_4_0_,
team1_.name as name2_7_1_
from
member member0_
inner join
team team1_
on member0_.team_id=team1_.team_id
member name : member1 member.getTeam team1
member name : member2 member.getTeam team2
member name : member3 member.getTeam team1