entityManager.find()
데이터베이스 조회를 통해 실제 엔티티 객체 반환
entityManager.getReference()
데이터베이스 조회를 통하지 않고 프록시 엔티티 객체 반환
실제 사용시에 DB를 조회해서 실제 Entity 생성(프록시 객체 초기화) ex. member.getUsername()
# 프록시 특징
- 실제 클래스를 상속 받아서 만들어짐
- 실제 클래스와 겉모양이 같음
- 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨
- 프록시 객체는 실제 객체의 참조(target)를 보관
- 프록시 객체 호출하면 실제 target의 메소드 호출
- 처음 사용할 때 한 번만 초기화
- 프록시 객체 초기화 : 프록시가 실제 엔티티가 되는 것이 아니라 실제 엔티티(target)에 접근 가능해짐
- 프록시 객체는 원본 엔티티 상속 받음
실제 엔티티와 프록시 객체는 == 비교 시 false. instance of 로 비교해야함
- 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 entityManager.getReference()를 호출해도 실제 엔티티 반환
★ find(), getReference() : 엔티티에 처음 담긴 값을 반환 ★
처음에 실제 엔티티 객체가 담겼으면 실제 엔티티 객체를, 프록시 객체가 담겼으면 프록시 객체를 반환
하나의 엔티티에 대해 동일성을 보장해줘야하기 때문에!
★ org.hibernate.LazyInitializationException: could not initialize proxy
준영속 상태일 때 프록시를 초기화하면 예외 발생
(영속성 컨텍스트의 도움을 받을 수 없음. 트랜잭션 끝났을때, entityManager.clear(), entityManager.detach(entity))
# 프록시 확인
- 프록시 인스턴스 초기화 여부 확인
PersistenceUnitUtil.isLoaded(Object entity)
- 프록시 클래스 확인 방법
entity.getClass().getName()
- 프록시 강제 초기화(하이버네이트 제공)
org.hibernate.Hibernate.initialize(entity);
(참고) JPA 표준은 강제 초기화 없음 member.getName()으로 초기화해야함
인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본편(김영한 강사님) 강의를 수강하며 정리한 글입니다 :)
'개발 > JPA' 카테고리의 다른 글
[JPA] 연관관계 영속성 전이 CASCADE (0) | 2022.04.07 |
---|---|
[JPA] 지연 로딩 LAZY , 즉시 로딩 EAGER (0) | 2022.04.06 |
[JPA] 상속관계 매핑 - 상속 전략 (0) | 2022.04.06 |
[JPA] 영속성 컨텍스트 / 엔티티의 생명주기 (0) | 2022.03.31 |
[JPA] Spring Data JPA - Query Method / 쿼리 메소드 / 간단한 쿼리는 쿼리 메소드 사용하면 편리 (0) | 2022.01.20 |
댓글