【问题标题】:JPA Hibernate collections not lazily loadedJPA Hibernate 集合没有延迟加载
【发布时间】:2013-04-30 07:34:10
【问题描述】:

我有一个 JPA 设置,如果我不使用延迟加载,几乎整个数据库都会被加载。我也直接在模型上使用序列化,所以有时我需要初始化代理。

我只想对集合使用延迟加载。急切地获取一些单一实体的事实很好。但无论我如何尝试设置集合,我从来没有得到代理集合,我总是得到完全加载的集合。

这是一些示例代码:

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

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

当我想要线程时,我使用 entityManager.find(Thread.class, "ID"),并且无论我是否有 fetch = FetchType.LAZY,所有像这样的集合总是完全加载。

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

另一方面,我使用 Intellij 并用它来设置带有 Hibernate 的 JPA。 我还问了一个类似的问题,我希望集合完全为空,但我不确定这是否可能,因此我提出了这个问题。

JPA Hibernate want lazy load to return empty collection

我还没有在 stackoverflow 上看到这个看似基本的问题的好答案。如果问题确实以教学方式回答,请仅回复链接,因为我是 JPA/Hibernate 和数据库的新手。

非常感谢您!

【问题讨论】:

    标签: java hibernate jpa lazy-loading one-to-many


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!很抱歉忘记接受你的回答=)我错过了调试器实际上调用了我背后的方法,这导致了我的困惑。
    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2016-10-10
    • 1970-01-01
    相关资源
    最近更新 更多