- em.find() : 실제 엔터티 개체에 대한 데이터베이스를 검색합니다.
- em.getReference() : 프록시 엔터티 개체를 검색하고 데이터베이스 조회를 연기합니다.

- 프록시 기능
- 실제 클래스를 상속받아 생성됩니다.
- 실제 클래스와 동일한 모습입니다.
- 실제 개체(대상)에 대한 참조를 유지합니다.
- 따라서 프록시 개체를 호출하면 프록시 개체가 실제 개체의 메서드를 호출합니다. ( 대리인 – 대리인 )

프록시 개체의 초기화
Member member = em.getReference(Member.class, 아이디 번호);
member.getName();
- Member.getName();
- 프록시에서 지속성 컨텍스트에 대한 초기화 요청
- 지속성 컨텍스트에서 DB에 대한 쿼리
- 지속성 컨텍스트에서 실제 엔터티 만들기
- target.getName();
프록시의 특성
- 프록시 객체는 처음 사용될 때 한 번만 초기화됩니다.
- 프록시 개체를 초기화할 때 프록시 개체는 실제 엔터티로 캐스팅되지 않습니다. 초기화 후 프록시 개체를 통해 실제 엔터티에 액세스할 수 있습니다.
- 프록시 개체는 원래 엔터티에서 상속됩니다. (의 예)
- 찾고 있는 엔터티가 지속성 컨텍스트에 이미 있는 경우 em.getReference()를 호출하면 실제 엔터티가 반환됩니다.
- 반영구적 상태에서 프록시를 초기화하면 문제가 발생합니다. 이 시점에서 Hibernate는 org.hibernate.LazyInitializationException 예외를 발생시킵니다.
프록시 확인
- 프록시 인스턴스가 초기화되었는지 확인하는 방법
PersistenceUnitUtil.isLoaded(Object entity)
- 프록시 클래스를 확인하는 방법
entity.getClass().getName()
- 강제 프록시 재설정
org.hibernate.Hibernate.initialize(entity);

