2012-10-12 55 views
1

我收集Hibernate使用javassist库来处理对象的惰性初始化。说我有以下实体(getter/setter方法/注解是截断):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对象属性显示为空。

只有在Case B之后,我将name值保存到localVariableName中,我可以看到localVariableName获得非空值。

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

+1

这可能有助于http://www.javalobby.org/java/forums/t20533.html – xyz

+2

您的诊断错误。 A和B是完全一样的东西。不管你存储结果还是不存储在局部变量中都是无关紧要的。所以如果A不会抛出异常,B不会。由于一切都在事务性方法中,所以不应该有任何异常。 –

+0

它实际上不会引发异常,但在案例A期间整个对象的属性被初始化为空。在案例B中,这是它们用来自数据库的值填充的时间。我会更新这篇文章以清楚说明。 –

回答

8

懒惰初始化的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

所以懒惰的初始化按预期工作。

相关问题