JPA Hibernate的集合不延迟加载(JPA Hibernate collections no

2019-09-01 10:49发布

我以这样的方式,如果我不使用延迟加载,几乎整个数据库将被加载的JPA设置。 我也用直接在车型序列化所以有时我需要初始化代理。

我只想对集合使用延迟加载。 有些奇异实体预先抓取的事实工作得很好。 但无论我如何努力设置藏品我从来没有得到代理的集合,我总是满载集合。

这是一些示例代码:

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

因此,这里的问题是,当我检查调试程序,答复的persistantBag列表总是充满了信息,并实际回复对象,我想空的代理来代替。

我用entityManager.find(Thread.class,“ID”),当我想线程和喜欢这些所有集合总是满载不管我取= FetchType.LAZY与否。

据我了解,设置fetchtype懒惰应该工作,我希望它。 此外,我想使用thread.getReplies时加载的实体(),这样我可以序列化,并将它们发送到客户端。 我不知道是否getReplies将与被代理机构工作,因为我从来没有得到任何集合延迟加载。

在一个侧面不是我用的IntelliJ并用它与Hibernate设置JPA。 我也问过类似的问题,我想收集是完全空的,但我不知道这是可能的,我为此提出这个问题来代替。

JPA休眠想偷懒负载返回空集

我还没有看到关于计算器这个看似基本的问题一个很好的答案。 请只用一个链接回答如果问题是在教学方式真的回答了,因为我是新来的JPA / Hibernate和真正的数据库以及。

非常感谢你提前!

Answer 1:

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

调用getReplies()将简单地返回这个不是初始化列表。 调用列表本身上的方法只有当(如size()iterator()将休眠通过执行一个SQL查询装载线程的所有答复的状态初始化列表。

使用调试器来检查一下集合包含是不是一个好主意,因为调试器通常要求你的背部,这将导致该列表来初始化本身背后的名单上的方法。 您可以检查是否收集使用初始化Hibernate.isInitialized(thread.getReplies())方法。

关于你提到的其他问题:Hibernate的用于数据库中的行映射为对象。 如果线程的答复,Hibernate会不会告诉你,它不通过返回你的空单已任。 这将是一个严重的错误。 如果你不希望加载的答复,只是不叫答复的名单上的任何方法。



文章来源: JPA Hibernate collections not lazily loaded