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

问题描述 投票:0回答:2

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

hibernate jpa lazy-loading
2个回答
1
投票

在任何

@*ToOne
关系中,目标方显然可以被假定为“属于”源作为逻辑部分。因此,可以预期,如果目标对象被访问,则只会发生在源对象上。而且这也是会发生的事情。 对于

@*ToMany

,很难预先知道将需要哪个目标对象,或者加载关系的源端的程序在某个时间是否需要所有相关对象。那么盲目加载相关对象就会浪费资源。


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

导致该启发式的基本问题是:

需要哪些相关对象以及这些对象能否有效提供。


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


0
投票
@rpy 完全错误。

EAGER

关联中的默认

XToMany
获取类型
实际上是JPA
的设计缺陷。 JPA 规范的核心设计者之一(Gavin King,也是 Hibernate 的创建者)本人在 Twitter 上声明了这一点。 甚至在即将发布的 JPA 规范版本中还有更改此行为的 PR。
© www.soinside.com 2019 - 2024. All rights reserved.