为什么hibernate @OneToOne和@ManyToOne使用Eager Loading和@OneToMany而@ManyToMany使用延迟加载?

时间:2016-03-23 07:19:14

标签: hibernate jpa lazy-loading

我在接受采访时被问到为什么hibernate @OneToOne和@ManyToOne使用Eager Loading和@OneToMany而@ManyToMany使用Lazy Loading?我向面试官解释的是,由于用户可能对结果列表不感兴趣,因此加载时需要更多时间,因此默认情况下它们是延迟加载的。但面试官并不满意。任何人都可以清楚地说明为什么hibernate社区会这样做吗?

1 个答案:

答案 0 :(得分:2)

在任何@*ToOne关系中,目标方明显可以假定属于作为逻辑部分。因此,可以预期,如果正在访问目标对象,则只会发生源对象。它也会发生这种情况。

对于@*ToMany,很难预先知道需要哪个目标对象,或者是否在某个时间由程序加载关系的源侧需要所有相关对象。在这种情况下,盲目加载相关对象将浪费资源。

此默认设置将确保在大多数情况下,可能要访问的对象存在于内存中,同时避免一次加载整个实例集。

导致启发式的基本问题是:
什么相关的对象将被嵌入,并且可以有效地提供这些对象。

如果默认值在给定数据模型中的某个点上不合适,您可以适当地更改延迟加载的设置。