gpt4 book ai didi

java - JPA:延迟加载光滑时刻

转载 作者:行者123 更新时间:2023-12-02 06:55:56 28 4
gpt4 key购买 nike

据我了解,JPA中的lazyLoadedObject即使在使用它的getter方法后也可能不会加载。因此,在下面的示例中,在笔划 1 之后,lazilyLoadededPerson 可能仍然为 null,并且只有在笔划 2 之后,容器才会对数据库运行查询。

lazilyLoadedPerson = runQueryToLoadPerson();
lazilyLoadedPerson.getName();

我的问题是:下面的代码在笔划 2 中是否包含错误?

lazilyLoadedPerson = runQueryToLoadPerson(); 
if (lazilyLoadedPerson != null) { //if lazilyLoadedPerson == null suppose that such person doesn't exists in database
return lazilyLoadedPerson.getName();
}

为什么我认为这将是一个错误:在上例中的笔画 1 之后,即使数据库中存在 lazilyLoadedPerson,lazilyLoadedPerson 也将为 null。我们遇到的情况是,实体存在于数据库中,但 getName() 方法永远不会被调用。

最佳答案

简短回答

延迟加载的对象永远为空。

更长的答案

该解释对于 Hibernate 有效,但其他 JPA 提供程序应该类似。请参阅the official documentation有关延迟加载如何工作的详细说明或 this short article短暂的。但核心事实是:

如果由于某种原因或另一个Hibernate决定延迟加载一个对象,你不会得到你想要的对象,而是得到该对象的代理(即不是 null-引用)。一旦您在代理上调用只能通过访问数据库才能知道的内容,代理就会执行此操作。如果您有一个 Activity session (并且满足一些其他条件),Hibernate 将执行必要的查询并返回调用。

你的例子

让我们以您的示例为例并使用声明对其进行扩展

MyPerson lazilyLoadedPerson = runQueryToLoadPerson(); 
if (lazilyLoadedPerson != null) { //if lazilyLoadedPerson == null suppose that such person doesn't exists in database
return lazilyLoadedPerson.getName();
}

假设您没有为类MyPerson定义代理类,Hibernate没有其他选择,只能从数据库中实际加载您想要的对象。原因之一正是您正在做的事情:如果它返回 null,您将无法检查该对象是否存在于数据库中。

建议

一开始担心延迟加载可能会很令人困惑。我的建议是,不要太早这样做。如果您刚刚了解 JPA,只需使用 fetch = FetchType.EAGER 注释所有集合,并且不定义任何代理,您就永远不会遇到延迟加载。

如果您更好地了解整个概念,您可以阅读延迟加载并相应地更改 xml 文件或注释。

关于java - JPA:延迟加载光滑时刻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17362059/

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