我认为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?
答案 0 :(得分:10)
延迟初始化的Hibernate管理对象由javassist代理对象管理。因此,在Eclipse调试器中,您必须知道在哪里查看。
offer
对象是一个代理对象,它包含一个处理程序对象,该对象包含一个名为initialized
的标志。它目前设置为false
。
在Case A
之后,处理程序的initialized
标志现在设置为true
。 handler.target
对象也会更改以反映实际offer
对象的初始化属性。
所以延迟初始化按预期工作。