Hibernate是否会根据前置查询决定集合中创建代理还是加载实体?
Hibernate代理对象复用的特性说明
这确实是Hibernate的特性,根源在于它的Session一级缓存和延迟加载代理机制:
- 当你先遍历
bs集合,访问每个B的c属性时,Hibernate会为对应的C类对象创建延迟加载代理,并把这个代理存入当前Session的缓存中。 - 后续遍历
cs集合时,Hibernate会先检查Session缓存,发现对应数据库记录的代理已经存在,就直接返回这个代理对象,不会再去数据库加载真实实例。 - 如果直接遍历
cs,此时缓存中没有对应C类的代理或实例,Hibernate会直接加载真实的C实例并加入缓存。
代码示例
class A { Set<B> bs; Set<C> cs; } class B { C c; } class C { // 类成员定义 }
内容的提问来源于stack exchange,提问作者otocon
相关产品推荐
相关产品推荐

