知识大全 Hibernate的检索策略小结

Posted

篇首语:男儿欲遂平生志,五经勤向窗前读。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate的检索策略小结相关的知识,希望对你有一定的参考价值。

Hibernate的检索策略小结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Hibernate的检索策略包括类级别检索策略和关联级别检索策略

  类级别检索策略有立即检索和延迟检索 默认的检索策略是立即检索 在Hibernate映射文件中 通过在<class>上配置lazy属性来确定检索策略 对于Session的检索方式 类级别检索策略仅适用于load方法 也就说 对于get qurey检索 持久化对象都会被立即加载而不管lazy是false还是true 一般来说 我们检索对象就是要访问它 因此立即检索是通常的选择 由于load方法在检索不到对象时会抛出异常(立即检索的情况下) 因此我个人并不建议使用load检索 而由于<class>中的lazy属性还影响到多对一及一对一的检索策略 因此使用load方法就更没必要了

  关联级别检索策略有立即检索 延迟检索和迫切左外连接检索 对于关联级别检索 又可分为一对多和多对多 多对一和一对一两种情况讨论

  一对多和多对多关联关系一般使用<set>配置 <set>有lazy和outer join属性 它们的不同取值绝对了检索策略

   )立即检索 这是一对多默认的检索策略 此时lazy=false outer join=false 尽管这是默认的检索策略 但如果关联的集合是无用的 那么就不要使用这种检索方式

   )延迟检索 此时lazy=true outer join=false(outer join=true是无意义的) 这是优先考虑的检索方式

   )迫切左外连接检索 此时 lazy=false outer join=true 这种检索策略只适用于依靠id检索方式(load get) 而不适用于query的集合检索(它会采用立即检索策略) 相比于立即检索 这种检索策略减少了一条sql语句 但在Hibernate中 只能有一个<set>配置成 outer join=true

  多对一和一对一检索策略一般使用<many to one> <one to one>配置 <many to one>中需要配置的属性是 outer join 同时还需要配置one端关联的<class>的lazy属性(配置的可不是<many to one>中的lazy哦) 它们的组合后的检索策略如下

   ) outer join=auto 这是默认值 如果lazy=true为延迟检索 如果lazy=false为迫切左外连接检索

   ) outer join=true 无关于lazy 都为迫切左外连接检索

   ) outer join=false 如果lazy=true为延迟检索 否则为立即检索

  可以看到 在默认的情况下(outer join=auto lazy=false) 对关联的one端对象Hibernate采用的迫切左外连接检索 依我看 很多情况下 我们并不需要加载one端关联的对象(很可能我们需要的仅仅是关联对象的id) 另外 如果关联对象也采用了迫切左外连接检索 就会出现select语句中有多个外连接表 如果个数多的话会影响检索性能 这也是为什么Hibernate通过hibernate max_fetch_depth属性来控制外连接的深度 对于迫切左外连接检索 query的集合检索并不适用 它会采用立即检索策略

cha138/Article/program/Java/ky/201311/28686

相关参考