gpt4 book ai didi

java - Eclipse 调试器显示 Hibernate 管理的对象尚未延迟初始化

转载 作者:行者123 更新时间:2023-12-02 11:07:23 25 4
gpt4 key购买 nike

我了解到 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值保存到localVariableName中时,我才能看到localVariableName获得非空值.

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

最佳答案

延迟初始化的 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

情况 A 之后,处理程序的 initialized 标志现在设置为 truehandler.target 对象也会发生变化,以反射(reflect)实际 offer 对象的初始化属性。

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

关于java - Eclipse 调试器显示 Hibernate 管理的对象尚未延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12852486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com