2012-10-12 3 views
1

Hibernate는 객체의 지연 초기화를 처리하기 위해 javassist 라이브러리를 사용합니다. 나는 다음과 같은 기관을 말해봐 (게터/세터/주석립니다) :Eclipse 디버거는 Hibernate 관리 객체가 지연 초기화되지 않았다는 것을 보여줍니다.

@Entity 
public class MainEntity { 
    private ComponentEntity comp; 
} 

@Entity 
public class ComponentEntity { 
    private Integer id; 
    private String name; 
} 

지금은 다음과 같은 메서드를 호출 :

@Transactional 
public void doSomething() { 
    MainEntity main = this.dao.find(1); 

    // Case A 
    main.getComp().getName(); 
    // Case B 
    String localVariableName = main.getComp().getName(); 
} 

DAO를 메인 검색

comp 객체가 아직 초기화되지 않습니다 게으른 초기화 때문입니다. Case A을 호출하면 comp 개체가 데이터베이스에서 검색되지만 디버거를 기반으로 모든 comp 개체 속성이 null로 표시 될 것으로 예상됩니다.

name 값을 localVariableName에 저장 한 다음에 만 localVariableName이 null이 아닌 값을 얻는 것을 볼 수 있습니다.

Eclipse에서 내 객체 속성을 null로 표시하는 이유는 무엇입니까?

+1

도움이 될 수도 있습니다. http://www.javalobby.org/java/forums/t20533.html – xyz

+2

진단 정보가 잘못되었습니다. A와 B는 완전히 똑같습니다. 결과를 로컬 변수에 저장할지 여부는 부적합합니다. 따라서 A가 예외를 throw하지 않으면 B가되지 않습니다. 모든 것이 트랜잭션 방식이기 때문에 예외가 없어야합니다. –

+0

실제로 예외는 발생시키지 않지만 사례 A에서 전체 개체의 속성이 null로 초기화됩니다. 사례 B에서는 데이터베이스의 값으로 채워지는 시간입니다. 이 소식을 분명하게 업데이트하겠습니다. –

답변

8

지연 초기화 된 Hibernate 관리 객체는 javassist 프록시 객체에 의해 관리됩니다. 따라서 이클립스 디버거에서는 어디를보아야하는지 알 필요가있다.

screenshot of null proxy object with handler.initialized set to false

offer 객체 initialized라는 플래그를 포함하는 핸들러 객체를 포함하는 프록시 객체이다. 현재는 false으로 설정되어 있습니다.

screenshot of proxy object with null props but with hander.initialized set to true and handler.target containing the initialized actual object

Case A 후, 핸들러의 initialized 플래그는 지금 true로 설정됩니다. handler.target 개체도 실제 offer 개체의 초기화 된 속성을 반영하도록 변경됩니다.

따라서 지연 초기화는 의도 한대로 작동합니다.

관련 문제