我在接受采访时被问到为什么hibernate @OneToOne和@ManyToOne使用Eager Loading和@OneToMany而@ManyToMany使用Lazy Loading?我向面试官解释的是,由于用户可能对结果列表不感兴趣,因此加载时需要更多时间,因此默认情况下它们是延迟加载的。但面试官并不满意。任何人都可以清楚地说明为什么hibernate社区会这样做吗?
答案 0 :(得分:2)
在任何@*ToOne
关系中,目标方明显可以假定属于作为逻辑部分。因此,可以预期,如果正在访问目标对象,则只会发生源对象。它也会发生这种情况。
对于@*ToMany
,很难预先知道需要哪个目标对象,或者是否在某个时间由程序加载关系的源侧需要所有相关对象。在这种情况下,盲目加载相关对象将浪费资源。
此默认设置将确保在大多数情况下,可能要访问的对象存在于内存中,同时避免一次加载整个实例集。
导致启发式的基本问题是:
什么相关的对象将被嵌入,并且可以有效地提供这些对象。
如果默认值在给定数据模型中的某个点上不合适,您可以适当地更改延迟加载的设置。