JPA/hibernate大型集合

4
在一个包含两种实体类型的场景中,父实体和子实体:
父实体: - @OneToMany Collection children;
默认情况下,子实体集合采用延迟加载。这个模型对于少量子实体非常适用,但如果子实体数量增长得非常大,这似乎是不可持续的。因此,在我认为子实体数量非常大的情况下,我使用带分页的服务方法(例如“getChildren(Parent parent, int offset, int count)”)来代替。
问题是:这是处理这种情况的最佳方式吗?还是我错过了什么?
谢谢, Piotr
3个回答

7
这种模式对于少量儿童非常有效,但如果数量增长得非常大,这似乎是不可持续的。我认为这完全取决于您想要做什么,但在大多数情况下,这是正确的。因此,在我认为儿童数量非常大的场合,我使用了带有分页的服务方法(例如“getChildren(Parent parent,int offset,int count)”)。如果需要浏览(可能非常)大量的结果,则分页是一种非常自然的方法。人们通常不想或不需要所有记录,并且他们无法处理巨大的结果数量。当然,应用程序必须立即处理所有结果的情况是不同的,但是JPA可能不适合它们。问题是:这是处理这种情况的最佳方式吗?还是我错过了什么?在我看来,它绝对比通过调用parent.getChildren()获取的整个集合来填充结果页面要好得多,并且将节省一些数据库、网络和应用程序服务器资源。您可能要考虑的另一件事是在搜索时限制最大结果数。与其分页10⁶个结果(谁会浏览那么多?),不如要求用户执行更严格的搜索,即添加搜索条件,直到结果数量变得更容易管理。这与您最初的问题有点不同。

谢谢,这是我需要的安慰。如果你愿意回答,当你进行域设计时,你是否会从所有者到子项收集,只是为了保持域模型设计的“正确性”,还是跳过它,只有从子项到父项的关系? - Piotr
@Piotr 我不会仅仅因为领域模型的正确性而选择它们。 - Pascal Thivent

5

像你现在这样做(即通过单独的查询来加载子项)可能是最好的解决方案。

还有一些需要考虑的事情:Hibernate提供了"extra-lazy"集合加载选项。使用常规的延迟加载,当您第一次访问集合时,整个集合都会被加载;但在 extra-lazy 模式下,Hibernate 可以按需逐个加载集合中的几个元素。我认为,除非直接使用 Hibernate API,否则无法访问此功能 - JPA 仅知道 "lazy" 和 "eager"。


0
你需要所有的子项吗?还是只需要从返回的整个列表中选择几个?如果是后者,直接查询所需的子实体。 如果你需要它们全部,考虑分页。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接