JPA/hibernate大集合

Pio*_*otr 4 java orm spring hibernate jpa

在具有两种类型实体的方案中,父级和子级:

家长 - @OneToMany收集儿童;

默认设置是对子集合进行延迟加载.这种模式适用于少数儿童,但如果数量增长很大,这似乎是不可持续的.因此,对于我认为子项数量非常大的场合,我使用了分页的服务方法(比如"getChildren(Parent parent,int offset,int count)").

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

谢谢,彼得

Pas*_*ent 7

这种模式适用于少数儿童,但如果数量增长很大,这似乎是不可持续的.

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

因此,对于我认为子项数量非常大的场合,我使用了分页的服务方法(比如"getChildren(Parent parent,int offset,int count)").

如果您需要显示(可能非常)大量的结果以进行浏览,则分页是一种非常自然的方法.人类通常不想要或不需要所有记录,但他们无论如何也无法处理大量的结果.应用程序必须立即处理所有结果的情况当然是不同的,但JPA可能根本不适合它们.

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

IMO,它肯定比使用您通过调用获得的整个集合提供结果页面要好得多parent.getChildren(),并且它将节省一些数据库,网络,应用服务器资源.

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


Mik*_*zak 5

像你一样做(也就是说,通过单独的查询加载孩子)可能是最好的解决方案.

还有一些需要考虑的事情:Hibernate可以为集合添加"extra-lazy".使用常规延迟加载时,首次访问时会加载整个集合; 但是在延迟模式下,Hibernate可以根据需要一次加载一些元素.除非您直接使用Hibernate API,否则我认为没有办法访问此功能 - JPA只知道"懒惰"和"渴望".