JPA / hibernate大集合

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

家长 – @OneToMany收集孩子;

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

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

谢谢,彼得

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

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

因此,对于我认为子项数量非常大的情况,我使用了分页的服务方法(比如“getChildren(Parent parent,int offset,int count)”)。

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

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

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

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

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

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

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