//...
try {
Member member = em.find(Member.class, 1L);
printMemberAndTeam(member); // 멤버&팀 출력 비지니스로직
printMember(member); // 멤버만 가져오고 싶을때..
//어떨땐 멤버만 가져오고 싶을때가 있는데... 팀까지 같이 조회하면 손해.
//지연로딩과 프록시로 해결이 가능.
}
//...
private static void printMember(Member member) {
System.out.println(member.getName());
}
private static void printMemberAndTeam(Member member) {
String username = member.getName();
//...
Team team = member.getTeam();
String teamName = team.getName();
//...
}
em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회
em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시)엔티티 객체 조회
//...
try {
Member member = new Member();
member.setName("AAA");
em.persist(member);
em.flush();
em.clear(); //영속성해제
Member findMember = em.find(Member.class, member.getId());
System.out.println(findMember.getId());
System.out.println(findMember.getName());
}
//...
위 경우에 멤버와 팀을 조인하여 select하는 쿼리가 나간다.
try {
Member member = new Member();
member.setName("AAA");
em.persist(member);
em.flush();
em.clear(); //영속성해제
Member findMember = em.getReference(Member.class, member.getId());
//System.out.println(findMember.getId());
//System.out.println(findMember.getName());
}
//...
위 경우에는 select하는 쿼리가 나가지 않는다.
단, 콘솔출력하는 부분의 주석을 해제하면 select쿼리가 나가게 된다. ( Id는 1차캐시에서 가져오고, getName할때 실제 쿼리가 실행된다.)
getRefernce 를 호출하는 시점에는 쿼리가 동작하지 않는다.