繁体   English   中英

JPA Hibernate集合未延迟加载

[英]JPA Hibernate collections not lazily loaded

我以这样一种方式进行了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。 我也曾问过一个类似的问题,我希望集合完全为空,但是我不确定这是否可行,因此我要问这个问题。

JPA Hibernate希望延迟加载以返回空集合

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

提前非常感谢您!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM