在JPA中指定延迟加载时,是否加载了所有子项或仅加载了一个子项?

时间:2011-01-18 01:27:52

标签: java jpa lazy-loading

我没有找到延迟加载的行为,如果我在JPA中有一个“一对多”的关系注释为延迟加载,在我的代码中我从父级调用方法“getChildren()”会发生什么?:

a)EclipseLink加载该父项的所有子项 b)EclipseLink在该父级时加载一个子级

如果响应是“a”,是否意味着对于数千或数百万条记录的大型数据集,我不应该使用“一对多”模型并实现我自己的服务器端分页模型?

谢谢。

2 个答案:

答案 0 :(得分:1)

A) - 当您访问OneToMany时,将加载所有子项。

如果OneToMany太大而无法加载,则不要映射它。请改为查询。您可以在Query上设置firstResult / maxResults。

@BatchSize对OneToMany无济于事。

答案 1 :(得分:0)

在JPA中,目前正在指定批量大小。因此,您的问题的答案实际上是(c),由实现来定义您的OneToMany集合的内容。它很可能是一个大于一的数字,但没有指定。

如果您使用的是Hibernate,则可以使用@BatchSize注释来指定要加载的数量。

如果您正在进行分页,那么您需要处理的问题之一就是您的收藏的起点。因此,如果您每页显示50个项目,并且您的用户位于第13页,共50页,则您希望从您的收藏中显示项目601 - 650。即使使用JPA延迟加载,也无法在集合中为其提供所需的位置。因此,您可能需要使用具有指定起始位置和最大结果的Query自己的分页方案。