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