2010-09-23 130 views
4

在场景中有两种类型的实体,父母与子女:JPA /休眠的大集合

家长 - @OneToMany收集儿童;

默认情况下,延迟加载子集合。这种模式适用于少数儿童,但如果数量变得非常大,这似乎难以为继。所以对于我认为孩子数量非常大的场合,我使用了分页服务方法(如“getChildren(Parent parent,int offset,int count)”)。

问题是:这是处理这种情况的最佳方法吗?或者我错过了什么?

感谢, 彼得

回答

7

这种模式的伟大工程,为孩子们的小数目,但如果数量变得非常大,这似乎是不可持续的。

我想说这一切都取决于你想要对他们做什么,但在大多数情况下,这是真的。

因此,对于我认为孩子数量非常大的场合,我已经使用了带分页的服务方法(如“getChildren(Parent parent,int offset,int count)”)。

寻呼是一个很自然的方法,如果你需要显示一个(可能非常)大量结果用于浏览。人类通常不需要或不需要所有记录,无论如何他们不能处理大量的结果。应用程序必须同时处理所有结果的情况当然不同,但JPA可能根本不适合他们。

问题是:这是处理这种情况的最佳方法吗?或者我错过了什么?

IMO,它绝对比与整个集合,你会通过调用parent.getChildren()得到喂养结果页面要好得多,这将节省一些数据库,网络,应用服务器资源。

您可能会考虑的另一件事是在执行搜索时限制结果的最大数量。而不是分页10⁶的结果(谁会去浏览这个结果?),这是很常见的(至少对我的经验来说)要求用户执行更严格的搜索,即添加搜索条件,直到结果的数量变得可人为管理。虽然这与你最初的问题有点不同。

+0

谢谢,这是我需要的保证。如果你关心的是,当你做域名设计的时候 - 你是否有从域名所有者到子女的收藏,只是为了保持领域模型设计“正确”,或者你是否跳过它,只有从子女到父母的关系? – 2010-09-24 08:11:11

+0

@Piotr我不会让他们只为领域模型的正确性。 – 2010-09-25 12:31:11

0

你需要所有的孩子吗?或者你只是要从返回的整个列表中选择一些?如果是这样,直接在子实体上查询你想要的东西。 如果您需要全部,请查看分页。

5

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

需要考虑的其他事情:Hibernate可以选择集合的"extra-lazy" loading。通过常规的延迟加载,整个集合在第一次访问时加载;但在超懒惰模式下,Hibernate可能会根据需要一次加载一些元素。我不认为有任何方式可以访问这个功能,除非你直接使用Hibernate API-- JPA只知道“懒”和“急于”。