Hibernate中onetoone、manytoone和onetomany的java默认获取类型
hibernate映射中的默认获取类型是什么
探索之后,我了解到:
- 对于一对一,它是渴望的李>
- 对于一对多来说,它是懒惰的李>
但在Eclipse中测试之后,它对所有这些都非常渴望
这是否取决于我使用的是JPA还是Hibernate
你可以在下面搜索框中键入要查询的问题!
hibernate映射中的默认获取类型是什么
探索之后,我了解到:
但在Eclipse中测试之后,它对所有这些都非常渴望
这是否取决于我使用的是JPA还是Hibernate
# 1 楼答案
我知道在问这个问题时答案是正确的,但由于人们(像我这一分钟)仍然碰巧发现他们在想为什么他们的WildFly 10表现不同,我想为当前的Hibernate 5提供一个更新。x版本:
在Hibernate 5.2 User Guide中,它在第11.2章中说明。应用获取策略:
因此,Hibernate的行为也与上述JPA的Ashish Agarwal类似:
(见JPA 2.1 Spec)
# 2 楼答案
这取决于您使用的是JPA还是Hibernate
在JPA 2.0 spec中,默认值为:
在冬眠中,一切都是懒惰的
更新:
Hibernate的最新版本与上述JPA默认值一致
# 3 楼答案
为了回答您的问题,Hibernate是JPA标准的一个实现。Hibernate有自己的操作怪癖,但根据Hibernate docs
所以Hibernate总是使用延迟抓取策略加载任何对象,不管您声明了什么类型的关系。它将为一对一或多对一关系中的单个对象使用一个惰性代理(应该未初始化但不为null),以及一个null集合,当您尝试访问它时,它将使用该集合中的值
应该理解,除非指定
fetchType.EAGER
,否则Hibernate仅在您尝试访问对象时尝试用值填充这些对象# 4 楼答案
对于单值关联,即-一对一和多对一:-
默认延迟=代理
代理延迟加载:-这意味着已加载关联实体的代理对象。这意味着仅为关联实体的代理对象加载连接两个实体的id。
例如:A和B是具有多对一关联的两个实体。ie:每个B可能有多个A。A的每个对象将包含B的引用。
`
`
关系A将包含列(实体A的aid、bid等其他列)
关系B将包含列(投标,…实体B的其他列)
代理意味着在提取A时,只提取B的id,并将其存储到只包含id的B的代理对象中。 B的代理对象是代理类的对象,代理类是B的子类,只有最小字段。 由于bid已经是关系A的一部分,因此无需启动查询即可从关系B获取bid。 只有在访问bid以外的字段时,才会延迟加载实体B的其他属性
对于集合,即多对多和一对多:-
默认延迟=true
还请注意,获取策略(选择、加入等)可以覆盖延迟。 ie:如果lazy='true'和fetch='join',则获取A也将获取B或B(对于集合)。如果你仔细想想,你就能找到原因。
单值关联的默认提取为“join”。
集合的默认提取是“选择”。 请验证最后两行。我从逻辑上推断了这一点