当前位置: 首页 > 面试题库 >

JPA Hibernate集合未延迟加载

徐茂材
2023-03-14
问题内容

我以这样一种方式进行了JPA设置:如果我不使用延迟加载,则几乎将加载整个数据库。我也直接在模型上使用序列化,因此有时我需要初始化代理。

我只想在集合上使用延迟加载。急切地获取一些奇异实体的事实就很好了。但是,无论我如何尝试设置集合,我都永远不会得到代理集合,而我总是会得到完全加载的集合。

这是一些示例代码:

@Entity
public class Thread implements Externalizable {
    @OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY)
    public List<Reply> getReplies() {
        return replies;
    }

所以这里的问题是,当我检查调试器时,答复的persistantBag-list始终充满信息,并且是实际的答复对象,而不是我想要的空代理。

当我想要线程时,无论是否具有fetch =
FetchType.LAZY,我都始终使用完全加载的entityManager.find(Thread.class,“ ID”)。

据我了解,设置fetchtype
lazy应该可以按我的意愿工作。另外,我希望在使用thread.getReplies()时加载实体,以便可以序列化并将其发送到客户端。我不知道getReplies是否可以与代理实体一起工作,因为我从来没有延迟加载任何集合。

一方面,我不使用Intellij并将其用于通过Hibernate设置JPA。我也曾问过一个类似的问题,我希望集合完全为空,但是我不确定这是否可行,因此我要问这个问题。

对于这个关于stackoverflow的基本问题,我还没有看到一个好的答案。如果由于我是JPA /
Hibernate和数据库的新手,那么如果确实以教学法回答了该问题,请仅通过链接回复。

提前非常感谢您!


问题答案:

惰性集合不包含代理。该集合本身是一个延迟加载的集合。这意味着当您从数据库中获取线程时,其回复列表将不会初始化。

调用getReplies()将仅返回此未初始化的列表。只有在调用列表本身的方法(如size()iterator())时,Hibernate才会通过执行SQL查询来初始化列表,该查询加载线程的所有回复的状态。

使用调试器检查集合中包含的内容不是一个好主意,因为调试器通常在背后的列表上调用方法,这会导致列表初始化。您可以检查是否使用Hibernate.isInitialized(thread.getReplies())方法初始化了集合。

关于另一个问题:Hibernate用于将数据库行映射到对象。如果某个线程有回复,则Hibernate不会通过向您返回一个空列表来告诉您它没有任何线程。那将是一个严重的错误。如果您不想加载回复,只需不要在回复列表中调用任何方法。



 类似资料:
  • 问题内容: 我以这样一种方式进行了JPA设置:如果我不使用延迟加载,则几乎将加载整个数据库。我也直接在模型上使用序列化,因此有时我需要初始化代理。 我只想在集合上使用延迟加载。急切地获取某些奇异实体的事实就很好了。但是,无论我如何尝试设置集合,我都永远不会得到代理集合,而我总是会得到完全加载的集合。 这是一些示例代码: 所以这里的问题是,当我检查调试器时,答复的persistantBag-list

  • 我有两个具有一对多关系的实体: 但当我调用get方法来加载用户信息时,我可以在日志文件中看到检索用户角色的附加查询也被调用。我如何使用spring数据rest防止它?

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 问题内容: 我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与spring或hibernate有关,并且他们的后代不适用或没有帮助。 该应用程序是在Wildfly应用程序服务器上运行的JEE和JPA2.1。有两个实体,DAO会话bean和servlet将它们放在一起: 当我运行此代码时,它失败并显示: 我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何的想

  • 问题内容: 我想知道在node.js中使用是否等效于延迟加载? 例如,如果我有一个函数需要代码中其他任何地方都不需要的特定node.js包,那么我最好在该函数内部使用它,以便仅在调用该函数时才包含所需的包。 我还不确定是否会由于缺乏对node.js架构的了解而在性能方面有所改善?我想它每次与服务器的连接都会使用更少的内存。但是,当它必须读取程序包时,它会增加磁盘的I / O吗,还是将其添加到内存中

  • 这是从这里开始的后续行动。 我正在实现一个表,它将数据异步加载到表单元格中。问题是,表单元格有时无法正确更新。有时它会以某种方式“挂起”并永远显示“加载...”。实际值只有在我在表中滚动一点时才会更新。 要复制,请在表格中快速向下滚动应用程序。某些单元格不会显示“延迟加载”值,而是显示占位符字符串。 延迟加载属性如下所示: } 应用程序如下所示: 完整的可运行代码可以在这里找到。