프록시 조회
엔티티의 조회 // em.find(XXX.class, "id");
프록시 조회 // em.getReference(XXX.class, "id");
프록시 객체의 초기화
- getReference 를 통해 특정 객체의 프록시를 호출한다.
- 프록시 객체의 참조(Target Id) 가 비어있기 때문에 영속성 컨텍스트에 초기화 요청을 한다.
- 실제 DB 에서 특정 객체 DB를 조회하여 실제 엔티티를 생성한다.
- 프록시 객체의 참조(Target Id) 와 실제 엔티티를 연결한다.
# 프록시 강제 초기화 : org.hibernate.Hibernate.initialize(entity);
이 때, 프록시 객체의 메소드를 호출하면 참조에 연결된 특정 객체의 메소드를 반환한다.
프록시의 특징
- 프록시 객체는 실제 객체의 참조(Target Id)를 보관한다. 따라서 프록시를 호출하게 되면 참조를 통해 실제
객채의 메소드를 호출하게 된다. - 프록시 객체는 처음 사용할 때 한 번만 초기화 한다.
- 프록시 객체는 원본 엔티티를 상속받기때문에 타입 체크시 유의해야 한다. ( instance of 비교를 사용 )
- 영속성 컨텍스트에 찾으려는 엔티티가 이미 있을 경우..
em.getReference()를 호출해도 프록시가 아닌 실제 엔티티를 반환한다. [ 반대도 마찬가지 ]
영속성 컨텍스트에 엔티티가 존재하는데, 굳이 프록시를 반환할 이유가 없음 - 준영속 상태 [ 영속성 컨텍스트의 도움을 받을 수 없다 ] 일 때, 프록시를 초기화 하게되면 문제가 발생한다.
영속성 컨텍스트에서 프록시 객체를 특정할 수 없기 때문
'JPA with 김영한' 카테고리의 다른 글
영속성 전이와 고아객체 (0) | 2021.09.13 |
---|---|
즉시로딩 과 지연로딩 (0) | 2021.09.10 |
상속관계의 매핑 (0) | 2021.09.08 |
다양한 연관관계 매핑 (0) | 2021.09.05 |
연관관계 매핑 (0) | 2021.09.04 |