在Hibernate中检索战略的操纵详解[Java编程]
本文“在Hibernate中检索战略的操纵详解[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Hibernate的检索战略包含类级别检索战略和关联级别检索战略.
类级别检索战略有当即检索和耽误检索,默许的检索战略是当即检索.在Hibernate映射文件中,通过在<不着class>上配置lazy属性来肯定检索战略.关于Session的检索方法,类级别检索战略仅实用于load办法;也就说,关于get、qurey检索,长期化对象城市被当即加载而不管lazy是false还是true.普通来说,我们检索对象就是要拜候它,因此当即检索是普通的挑选.由于load办法在检索不到对象时会抛出非常(当即检索的情形下),因此我个人并不倡议利用load检索;而由于< class>中的lazy属性还影响到多对一及一对一的检索战略,因此利用load办法就更没必要了.
关联级别检索战略有当即检索、耽误检索和急迫左外衔接检索.关于关联级别检索,又可分为一对多和多对多、多对一和一对一两种情形谈论.
一对多和多对多关联关系普通利用< set>配置.< set>有lazy和outer-join属性,它们的差别取值绝对了检索战略.
1)当即检索:这是一对多默许的检索战略,此时lazy=false,outer-join=false.固然这是默许的检索战略,但假如关联的调集是无用的,那么就不要利用这种检索方法.
2)耽误检索:此时lazy=true,outer-join=false(outer-join=true是无意义的),这是优先考虑的检索方法.
3)急迫左外衔接检索:此时 lazy=false,outer-join=true,这种检索战略只实用于依靠id检索方法(load、get),而不实用于query的调集检索(它会采取当即检索战略).相比于当即检索,这种检索战略削减了一条sql语句,但在Hibernate中,只能有一个配置成 outer-join=true.
多对一和一对一检索战略普通利用< many-to-one>、< one-to-one>配置.< many-to-one>中需求配置的属性是 outer-join,同时还需求配置one端关联的< class>的lazy属性(配置的可不是< many-to-one>中的lazy哦),它们的组合后的检索战略以下:
1) outer-join=auto:这是默许值,假如lazy=true为耽误检索,假如lazy=false为急迫左外衔接检索.
2) outer-join=true,无关于lazy,都为急迫左外衔接检索.
3) outer-join=false,假如lazy=true为耽误检索,不然为当即检索.
可以看到,在默许的情形下(outer-join=auto,lazy=false),对关联的one端对象Hibernate采取的急迫左外衔接检索.依我看,很多情形下,我们并不需求加载one端关联的对象(极大概我们需求的仅仅是关联对象的id);别的,假如关联对象也采取了急迫左外衔接检索,就会呈现select语句中有多个外衔接表,假如个数多的话会影响检干脆能,这也是为什么Hibernate通过hibernate.max_fetch_depth属性来掌握外衔接的深度.关于急迫左外衔接检索,query的调集检索并不实用,它会采取当即检索战略.
关于检索战略,需求按照实际情形举行挑选.关于当即检索和耽误检索,它们的长处在于select语句简单(每张表一条语句)、查询速度快,缺陷在于关联表时需求多条select语句,增添了拜候数据库的频率.因此在挑选即检索和耽误检索时,可以考虑利用批量检索战略来削减select语句的数目(配置batch-size属性).关于切左外衔接检索,长处在于select较少,但缺陷是select语句的复杂度提高,多表之间的关联会是很耗时的操作.别的,配置文件是死的,但程序是活的,可以按照需求在程序里显示的指定检索战略(大概常常需求在程序中显示指定急迫左外衔接检索).为了清楚检索战略的配置效果若何,可以配置show_sql属性查看程序运行时Hibernate履行的sql语句.
以上是“在Hibernate中检索战略的操纵详解[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |