해결된 질문
작성
·
220
답변 3
2
안녕하세요. DolphaGo님 좋은 질문입니다.
아마 코드 상위에 해당 엔티티를 저장했거나, 또는 이미 한번 조회해서 그럴꺼에요^^
영속성 컨텍스트에 이미 영속상태로 관리되고 있는 엔티티를 프록시로 조회하면, 프록시로 반환할 이유가 없기 때문에(+영속성 컨텍스트의 동일성 보장) 기존 영속성 컨텍스트에서 관리중인 엔티티를 반환해줍니다.
조회한 프록시 객체를 다음과 같이 출력해보시면
System.out.println("ref = " + ref.getClass());
class hellojpa.Member -> 이런식으로 해당 엔티티 클래스 명이 정확하면 기존에 관리되면 엔티티가 조회된 것이고,
class hellojpa.Member$HibernateProxy$VYWPiECl -> 이런식으로 프록시 클래스가 사용되면 실제 프록시를 통해서 조회된 것입니다.
감사합니다.
1
1
정말 감사합니다 ㅠㅠㅠㅠ
그러게요. 항상 JPA는 프록시든 실제 엔티티든 영속성 컨텍스트가 관리를 하면 타입을 일치시켜준다는 사실을 잠깐 잊고 있었네요.
그래서 말씀하신것처럼 프록시가 아닌 실제 엔티티를 반환하고 있었습니다. 영속성 컨텍스트를 다 비워주고 getReference()를 호출하여 해결했습니다. 데이터 저장과 참조를 Main에서 같이 실험해서 그랬네요. 실제 개발을 할 땐 LazyInitializationException이 왜 발생하는 것인지 몰랐어서 답답했었는데, 이번 강의를 두번 세번 들으면서 프록시에 대한 개념을 잘 잡게 되었습니다. 정말 감사합니다..
제가 그토록 원하던 LazyInitializationException을 봐서 기분이 너무 좋네요 ㅎㅎ..
휴일에도 답변해주셔서 정말 감사합니다.^^