2

我收集到 Hibernate 使用 javassist 库来处理对象的延迟初始化。假设我有以下实体(getters/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值保存到 a之后localVariableName,我才能看到 localVariableName 得到一个非空值。

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

4

1 回答 1

10

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

将 handler.initialized 设置为 false 的空代理对象的屏幕截图

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

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

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

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

于 2012-10-12T06:48:02.163 回答