Hibernate中一对一,多对一和一对多的默认提取类型

Ric*_*cha 90 java hibernate jpa

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

探索之后我才知道的是:

  • 一对一,它是渴望.
  • 对于一对多它是懒惰的.

但是在Eclipse中测试之后,它渴望所有人.

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

小智 166

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

根据JPA 2.0规范,默认值为:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER
Run Code Online (Sandbox Code Playgroud)

在休眠中,一切都是懒惰的

更新:

最新版本的Hibernate与上述JPA默认值一致.

  • "在休眠状态下,一切都是懒惰的"显然它在最近的版本中发生了变化.请参阅[AlexanderRühl的答案](http://stackoverflow.com/a/42168093/3136474). (11认同)
  • Hibernate 是 JPA 实现之一,因此一旦您使用 Hibernate,您就在使用 JPA :) (2认同)

Ale*_*ühl 50

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

Hibernate 5.2用户指南中,它在第11.2章中说明.应用获取策略:

Hibernate的建议是静态标记所有懒惰的关联,并使用动态提取策略进行渴望.遗憾的是,这与JPA规范不一致,该规范定义 了默认情况下应该急切地获取所有一对一和多对一关联.作为JPA提供者,Hibernate尊重该默认值.

因此,Hibernate的行为与上面针对JPA所述的Ashish Agarwal一样:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER
Run Code Online (Sandbox Code Playgroud)

(见JPA 2.1规范)


Jam*_*ENL 15

为了回答你的问题,Hibernate是JPA标准的一个实现.Hibernate有自己的操作怪癖,但根据Hibernate文档

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

因此,无论您声明了什么类型的关系,Hibernate都将使用延迟提取策略加载任何对象.对于一对一或多对一关系中的单个对象,它将使用惰性代理(对于未初始化但不为空),以及当您尝试访问它时,它将使用值进行水合的空集合.

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