Hibernate检索策略

2023-04-12


Hibernate检索策略


Hibernate检索策略:


立即检索、延迟检索、迫切左外连接检索


Hibernate检索策略应用对象级别


类级别、关联级别


以下表格为类级别和关联级别可选的检索策略及默认的检索策略



检索策略的作用域




可选的检索策略




默认的检索策略




运行时行为受影响的Session的检索方法




类级别




立即加载



延迟加载



立即检索




Load()方法




关联级别




立即加载



延迟加载


迫切左外连接检索



多对一或者一对一为迫切左外连接检索



一对多或者多对多为立即检索



Get()、Load()、Find()方法




以下表格为用于在对象-关系映射文件中设定检索策略的属性



属性




可选值




默认值




描述




lazy




true、false




false




如果为true表示使用延迟加载,如果为false表示使用立即加载




outer-join




auto、true、false




元素和



元素中为auto,在元素和元素中为false



如果为true表示使用迫切左外连接检索。在、和元素中包含此属性



如果为false表示使用立即加载



batch-size




正整数




1




设定批量检索的数量。如果设定此项合理的取值在3-10之间




一、类级别的检索策略:


Session的Load()、Get()、Find()方法受到检索策略的影响


Load()方法的立即检索:立即查询数据库并初始化类实例,查询不到是抛异常


Load()方法的延迟检索:不检索数据库只返回类的代理实例,举例说明一个Custom类


当Custom类通过Session.Load()方法延迟加载持久化对象时,只是将Custom对象的对象标识赋值,并没有操作数据库;当我们访问这个对象的标识属性时也只是简单返回对象标识,并不操作数据库。而当我们访问Custom对象的其它属性时由于没有初始化,所以要检索数据库并赋值给该属性。这个时候要保证此对象的Session连接时正常的。


Get()方法的检索策略:只有立即加载策略。查询不到返回null


Find()方法的检索策略:只有立即加载策略。


如果我们在使用Session的Load()、Get()、Find()方法时并不知道检索策略,我们可以在调用这些方法后立即执行以下代码来初始化持久化对象:


If( !Hibernate.isInitialized(customer))  
{  
         Hibernate.initialize(customer);  
}

二、关联级别的检索策略


一对多和多对多关联的检索策略



lazy属性




outer-join属性




检索策略




false




false




采用立即检索,这是默认的检索策略,当使用Hibernate的第二级缓存时,可以考虑采用立即检索。




true




false




采用延迟检索




false




true




采用迫切左外连接检索,对于Hibernate2.0以下,再映射文件中如果有多个元素,只允许有一个元素的outer-join属性为true




true




true




没有任何意义




注意:对于Session.find()方法会忽略迫切左外连接检索,采用立即检索策略


多对一和一对一关联的检索策略


Order对象与Custom对象之间的多对一关系



Order.hbml.xml的



元素的


outer-join属性



Custom.hbm.xml的元素的lazy属性




检索order对象时对关联的custom对象使用的检索策略




auto




true




延迟检索




auto




false




迫切左外连接检索




true




true




迫切左外连接检索




true




false




迫切左外连接检索




false




true




延迟检索




false




false




立即检索




批量检索:


设置元素的batch-size,这样再进行查询时能够在Sql中采用or连接词,减少查询次数。


、提高查询性能:


1、尽量使用迫切连接,以减少查询数据库的次数。


2、对使用延迟加载或者立即检索策略设置批量 查询数目,以检索查询数据库的次数。


3、使用查询缓存


4、有的时候数据量较大,只负责显示的数据可使用Sql查询,以减少缓存空间。


5、尽量减少返回记录集字段的数目,只返回所需要的字段。


6、使用集合过滤,也就是说通过第一次查询的结果来再次进行查询。


二、HQL方式与QBC方式的不同


1、HQL方式功能强大,可实现分组,外连、内连,而QBC则没有这些功能。


2、HQL语句写法接近Sql语句方式,容易上手。


3、HQL语句无法在编译期检查错误。而QBC能够做到。


4、QBC是面向对象的,而HQL语句还不是面向对象编程。


5、QBC能够动态创建查询,而HQL不能


6、QBC提供了接口,扩展性好,HQL方式不具有扩展性。


本文仅代表作者观点,版权归原创者所有,如需转载请在文中注明来源及作者名字。

免责声明:本文系转载编辑文章,仅作分享之用。如分享内容、图片侵犯到您的版权或非授权发布,请及时与我们联系进行审核处理或删除,您可以发送材料至邮箱:service@tojoy.com