hibernate映射中的默认获取类型是什么?
在探索之后,我了解到的是:
一对一的一对一就是一对多,lazy.就是
但在Eclipse中测试之后,它对所有的东西都很渴望。
这取决于我使用的是JPA还是Hibernate?
发布于 2014-10-28 13:55:36
这取决于您使用的是JPA还是Hibernate。
在JPA 2.0 spec中,默认值为:
OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER在hibernate中,一切都是惰性的
更新:
Hibernate的最新版本与上述JPA默认值保持一致。
发布于 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一样:
OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER(参见JPA 2.1 Spec)
发布于 2014-10-28 13:16:46
回答你的问题,Hibernate是JPA标准的一个实现。Hibernate有它自己的操作怪癖,但根据Hibernate docs
默认情况下,Hibernate对集合使用延迟选择获取,对单值关联使用延迟代理获取。这些默认值对于大多数应用程序中的大多数关联都是有意义的。
因此,Hibernate将始终使用延迟获取策略加载任何对象,无论您声明了哪种类型的关系。它将为一对一或多对一关系中的单个对象使用一个惰性代理(应该是未初始化的,但不是null),以及一个null集合,当您尝试访问它时,它将使用值进行水合。
应该理解的是,除非您指定fetchType.EAGER,否则Hibernate仅在您尝试访问对象时才会尝试用值填充这些对象。
https://stackoverflow.com/questions/26601032
复制相似问题