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

时间:2012-10-12 04:55:47

标签: 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;
}

现在我调用以下方法:

@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对象尚未初始化。我希望在调用Case A之后,将从数据库中检索comp对象,但是基于调试器,所有comp对象属性都显示为null。

只有在Case B之后我将name值保存到localVariableName中,我才能看到localVariableName获取非空值。

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

1 个答案:

答案 0 :(得分:10)

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

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标志现在设置为truehandler.target对象也会更改以反映实际offer对象的初始化属性。

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