em.find()
의 경우 메서드가 실행되는 시점에 바로 DB에 쿼리를 날린다.
그런데 em.getReference()
의 경우 실제 값이 사용되기 전까지 DB에 쿼리를 날리지 않는다.
em.getReference()
의 클래스를 조회하면 이렇게 나온다.
hellojpa.Member$HibernateProxy$odcVHpjy
이는 하이버네이트가 프록시라고 하는 가짜 엔티티를 주는 것이다.
target
)를 보관Member member = em.getReference(Member.class, “id1”);
member.getName();
instance of
를 사용해야한다.)em.getReference()
를 호출해도 실제 엔티티 반환LazyInitializationException
예외 발생)이런 경우는 많이 없긴한데, JPA에서는 프록시와 Member
객체를 같게 하는 것을 보장해줘야한다.
그러므로 처음에 em.find()
-> em.getReference()
를 한다면, 두 객체 모두 Member
로 나오고, 순서가 반대면 둘다 프록시가 나옴.
PersistenceUnitUtil.isLoaded(Object entity)
entity.getClass().getName()
출력org.hibernate.Hibernate.initialize(entity);
member.getName()