- em.find(): DB를 통해서 실제 Entity 객체 조회
- em.getReference(): DB 조회를 미루는 가짜(Proxy) Entity 객체 조회
- 실제 클래스를 상속 받아 만들어지고, 실제 클래스와 겉모양이 똑같음
타입 체크 시 == 비교 실패, instance of 사용
- 사용하는 입장에서는 진짜 객체인지 Proxy 객체인지 구분하지 않고 사용하면 됨(이론상)
몇가지 조심해야할 점은 있음
- 실제 객체의 참조(target)를 보관하고, Proxy 객체를 호출하면 Proxy 객체는 실제 객체의 메소드를 호출
- Proxy 객체는 처음 사용할 때 딱 한번만 초기화되고, Proxy 객체를 초기화할 때 Proxy 객체가 실제 Entity로 바뀌는 것은 아님. 초기화되면 Proxy 객체를 통해 실제 Entity에 접근 가능
- 영속성 컨텍스트에 찾는 Entity가 이미 있으면 em.findReference()를 호출해도 실제 Entity 반환 (반대도 마찬가지)
- 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제 발생
org.hibernate.LazyInitializationException 예외 발생
- Proxy Instance 초기화 여부 확인: emf.getPersistenceUnitUtil().isLoaded(Object entity)
- Proxy 클래스 확인: entity.getClass().getName() 출력
- Proxy 강제 초기화: org.hibernate.Hibernate.initialize(entity)
JPA 표준은 강제 초기화가 없음. (강제 호출을 해야함 -> member.getName())