Eclipse调试器显示Hibernate管理的对象尚未被懒惰地初始化

Jen*_*ing 2 java eclipse spring hibernate

我认为Hibernate使用javassist库来处理对象的延迟初始化.假设我有以下实体(getter/setters/annotations被截​​断):

@Entity
public class MainEntity {
    private ComponentEntity comp;
}

@Entity
public class ComponentEntity {
    private Integer id;
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

现在我调用以下方法:

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

    // Case A
    main.getComp().getName();
    // Case B
    String localVariableName = main.getComp().getName();
}
Run Code Online (Sandbox Code Playgroud)

当DAO检索main时,comp由于延迟初始化,该对象尚未初始化.我希望在调用之后Case A,comp将从数据库中检索该对象,但是基于调试器,所有comp对象属性都显示为null.

只有Case B在我将name值保存到localVariableName我可以看到localVariableName获取非null值之后.

为什么Eclipse将我的对象属性显示为null?

Jen*_*ing 10

延迟初始化的Hibernate管理对象由javassist代理对象管理.因此,在Eclipse调试器中,您必须知道在哪里查看.

使用handler.initialized设置为false的null代理对象的屏幕截图

offer对象是一个代理对象,它包含一个包含一个名为的标志的处理程序对象initialized.它目前设定为false.

代理对象的屏幕截图,包含null props但hander.initialized设置为true,handler.target包含初始化的实际对象

之后Case A,处理程序的initialized标志现在设置为true.该handler.target对象也改变以反映实际offer对象的初始化属性.

所以延迟初始化按预期工作.