Java Eclipse调试器显示Hibernate托管对象尚未延迟初始化

Java Eclipse调试器显示Hibernate托管对象尚未延迟初始化,java,eclipse,spring,hibernate,Java,Eclipse,Spring,Hibernate,我推测Hibernate使用javassist库来处理对象的延迟初始化。假设我有以下实体(getter/setter/annotation被截断): 现在我调用以下方法: @Transactional public void doSomething() { MainEntity main = this.dao.find(1); // Case A main.getComp().getName(); // Case B String localVariab

我推测Hibernate使用javassist库来处理对象的延迟初始化。假设我有以下实体(getter/setter/annotation被截断):

现在我调用以下方法:

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

    // Case A
    main.getComp().getName();
    // Case B
    String localVariableName = main.getComp().getName();
}
当DAO检索main时,由于延迟初始化,
comp
对象尚未初始化。我希望在调用
案例A
后,会从数据库中检索到
comp
对象,但基于调试器,所有comp对象属性都显示为null

只有在
案例B
之后,我将
名称
值保存到
localVariableName
中,我才能看到localVariableName获得非空值


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

Hibernate托管的对象是由javassist代理对象管理的,这些对象是惰性初始化的。因此,在Eclipse调试器中,您必须知道在哪里查找

offer
对象是一个代理对象,它包含一个处理程序对象,该处理程序对象包含一个名为
initialized
的标志。它当前设置为
false

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


因此,延迟初始化工作正常。

这可能有助于诊断错误。A和B是完全一样的东西。结果是否存储在局部变量中无关紧要。因此,如果A不抛出异常,B就不会抛出异常。因为所有内容都在事务方法中,所以不应该有任何异常。它实际上不会引发异常,但在案例a期间,整个对象的属性初始化为null。在案例B中,这是使用数据库中的值填充它们的时间。我会更新这篇文章以澄清这一点。@jbnize很抱歉你是对的。我一直在错误地查看Eclipse调试器。将更新问题和答案。
@Transactional
public void doSomething() {
    MainEntity main = this.dao.find(1);

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