728x90
em.find()와 em.getReference()
em.find()
- 데이터베이스에서 실제 엔티티 객체를 조회한다.
em.getReference()
- 데이터베이스를 조회 곧장 하지 않고 미룬다. 대신 가짜(프록시) 엔티티 객체를 조회한다.
프록시 객체의 특징
- 실제 클래스를 상속받아 만들어졌기 때문에 겉모양이 같다.
- 타입 체크시에는 원본 엔티티를 상속받기 때문에 instance of를 사용해야 한다.
- 사용하는 입장에서 진짜 객체인지 아닌지 구분하지 않고 사용할 수 있다.
- 프록시 객체는 실제 객체의 참조를 보관한다.
- 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출하는 방식으로 동작한다.
- 프록시 객체를 처음 사용할 때 한 번만 초기화한다. 초기화할 때는 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다.
- 영속성 컨텍스트에 찾는 엔티티가 있으면 em.getReference()를 호출해도 실제 엔티티를 반환한다.
- 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때는 프록시를 초기화할 때 문제가 발생한다.
프록시 인스턴스의 초기화 여부를 확인하는 방법
- PersistenceUnitUtil.isLoaded(Object entity)
프록시를 강제 초기화하는 방법
- org.hibernate.Hibernate.initialize(entity);
- jpa 표준은 강제 초기화가 없다.
- 강제 호출 방법은 getter를 이용하는 것이 일반적이다. ex) member.getName() 등
참고
김영한 - 자바 ORM 표준 JPA 프로그래밍
728x90
'[JAVA] > JPA' 카테고리의 다른 글
JPA - 영속성 전이: CASCADE와 고아 객체 (0) | 2023.04.17 |
---|---|
JPA - 즉시 로딩과 지연 로딩 사용시 주의할 점 (0) | 2023.04.17 |
상속관계 매핑과 @MappedSuperclass (0) | 2023.04.13 |
N+1 문제 3분 요약 정리 (0) | 2023.01.23 |
JPA - 엔티티와 테이블 매핑시 주의 사항 (2) | 2022.11.29 |