首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate中一对一、多对一和一对多的默认获取类型

Hibernate中一对一、多对一和一对多的默认获取类型
EN

Stack Overflow用户
提问于 2014-10-28 12:44:10
回答 4查看 129K关注 0票数 125

hibernate映射中的默认获取类型是什么?

在探索之后,我了解到的是:

一对一的一对一就是一对多,lazy.就是

但在Eclipse中测试之后,它对所有的东西都很渴望。

这取决于我使用的是JPA还是Hibernate?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-28 13:55:36

这取决于您使用的是JPA还是Hibernate。

JPA 2.0 spec中,默认值为:

代码语言:javascript
复制
OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

在hibernate中,一切都是惰性的

更新:

Hibernate的最新版本与上述JPA默认值保持一致。

票数 236
EN

Stack Overflow用户

发布于 2017-02-11 04:26:05

我知道在问这个问题的时候答案是正确的--但是由于人们(像我这样的人)仍然碰巧发现他们想知道为什么他们的WildFly 10表现不同,我想给出当前Hibernate 5.x版本的更新:

Hibernate 5.2 User Guide中,第11.2章对此进行了说明。应用fetch策略

,Hibernate的建议是静态地将所有关联标记为惰性,并使用动态获取策略来获取迫切性。不幸的是,这与JPA规范不一致,JPA规范定义,所有的一对一和多对一关联都应该通过默认的来获取。Hibernate作为JPA提供者,遵守该默认设置。

所以Hibernate的行为就像上面提到的JPA的Ashish Agarwal一样:

代码语言:javascript
复制
OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

(参见JPA 2.1 Spec)

票数 58
EN

Stack Overflow用户

发布于 2014-10-28 13:16:46

回答你的问题,Hibernate是JPA标准的一个实现。Hibernate有它自己的操作怪癖,但根据Hibernate docs

默认情况下,Hibernate对集合使用延迟选择获取,对单值关联使用延迟代理获取。这些默认值对于大多数应用程序中的大多数关联都是有意义的。

因此,Hibernate将始终使用延迟获取策略加载任何对象,无论您声明了哪种类型的关系。它将为一对一或多对一关系中的单个对象使用一个惰性代理(应该是未初始化的,但不是null),以及一个null集合,当您尝试访问它时,它将使用值进行水合。

应该理解的是,除非您指定fetchType.EAGER,否则Hibernate仅在您尝试访问对象时才会尝试用值填充这些对象。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26601032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档