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

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

  • 问题内容: 如果这是完全相同的内容,请纠正我,我知道这个话题经常被讨论,但是找不到确切的答案。 问题: 在MVC Web应用程序中处理Hibernate对象的最佳实用解决方案是什么? 细节: 我正在使用Hibernate,并希望在可能的情况下利用延迟加载。 我正在使用MVC风格的webapp。 我讨厌获得延迟加载初始化异常。 我讨厌不得不在事务之间重新连接Hibernate对象。 选项: 渴望装载

  • 这是我的pb。 我有一个实体游戏和一个实体控制台 这是一个多个关联。 为了提高性能,我在同一查询中加载游戏和控制台,如下所示: 当我使用

  • 我想知道为什么我在尝试获取附加到对象的对象列表时会出现此异常,但当列表为空时,我会出现延迟异常: 例如: 尝试访问<code>responsecat.listeDomain</code>时,我变得懒惰。在我的数据库中没有列表,但我在等待null,而不是异常。 是我做错了什么还是Hibernate就是这么工作的? 谢谢。 编辑:例外: 我注意到:当我使用在param中传递的会话时,我得到了延迟异常,