// Member와 Team이 N:1
public class Member {
...
@ManyToOne(fetch = FetchType.EAGER) // 즉시로딩
@JoinColumn(name = "TEAM_ID")
private Team team;
...
}
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member1 = new Member();
member1.setUserName("member1");
member1.setTeam(team);
em.persist(member1);
em.flush();
em.clear();
Member m = em.find(Member.class, member1.getId()); // 프록시가 아님(DB쿼리가 나감)
System.out.println("member1.getTeam() = " + m.getTeam().getClass());
m.getTeam().getName();
지연로딩
필요한 시점에 연관된 객체의 데이터를 불러오는 것
(fetch = FetchType.LAZY)
먼저 프록시를 가져온 후, 실제 사용 시 초기화(DB쿼리가 나감)
// Member와 Team이 N:1
public class Member {
...
@ManyToOne(fetch = FetchType.LAZY) // 지연로딩
@JoinColumn(name = "TEAM_ID")
private Team team;
...
}
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member1 = new Member();
member1.setUserName("member1");
member1.setTeam(team);
em.persist(member1);
em.flush();
em.clear();
Member m = em.find(Member.class, member1.getId()); // 프록시
System.out.println("member1.getTeam() = " + m.getTeam().getClass());
System.out.println("============");
m.getTeam().getName(); // 실제 team 사용 시 쿼리가 나감
모든 연관관계에 지연 로딩 사용(JPQL에서는 N+1 문제 발생)
@ManyToOne, @OneToOne : 기본이 즉시 로딩
@OneToOne, @ManyToMany : 기본이 지연 로딩
N+1문제
즉시로딩 + JPQL에서 발행
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member1 = new Member();
member1.setUserName("member1");
member1.setTeam(team);
em.persist(member1);
em.flush();
em.clear();
List<Member> members = em.createQuery("select m from Member m", Member.class)
.getResultList();
tx.commit();