Hibernate的检索策略小结

Hibernate的检索策略小结,第1张

Hibernate的检索策略小结,第2张

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

类级检索策略包括立即检索和延迟检索,默认的检索策略是立即检索。在Hibernate映射文件中,检索策略是通过在。对于Session的检索方法,类级检索策略只适用于load方法;也就是说,对于get和qurey检索,无论lazy是假还是真,持久对象都会被立即加载。一般来说,我们检索对象来访问它,所以立即检索是通常的选择。因为load方法在无法检索到对象时抛出异常(在立即检索的情况下),所以我个人不建议使用load检索;因为中的lazy属性也会影响多对一和一对一检索策略,所以更没有必要使用load方法。

相关级检索策略包括立即检索、延迟检索和紧急左外链检索。对于相关度检索,可以分为一对多和多对多、多对一和一对一的情况。

通常配置一对多和多对多关系。有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。

通常使用和配置多对一和一对一检索策略。需要在中配置的属性是outer-join,同时需要配置与一端关联的lazy属性(在中不是lazy)。组合后的检索策略如下:

1) outer-join=auto:这是默认值。如果lazy=true,则为延迟检索,如果lazy=false,则为紧急左外连接检索。

2) outer-join=true,与懒惰无关,全部是紧急左外连接搜索。

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

可以看到,默认情况下(outer-join=auto,lazy=false),关联的单边对象Hibernate采用紧急左外连接检索。在我看来,很多情况下,我们不需要加载单侧关联对象(大概只需要关联对象的id就可以了);此外,如果关联对象也采用紧急左外连接检索,那么select语句中会有多个外连接表,影响检索性能。这就是Hibernate通过hibernate.max_fetch_depth属性控制外部连接深度的原因。对于紧急左外连接检索,查询的集合检索不适用,将采用立即检索策略。

对于检索策略,需要根据实际情况进行选择。对于立即检索和延迟检索,它们的优点是select语句简单(每个表一条语句),查询速度快,但缺点是关联表时需要多条select语句,增加了访问数据库的频率。因此,在选择即时检索和延迟检索时,可以考虑使用批量检索策略来减少select语句的数量(配置batch-size属性)。对于左切外连接检索,优点是选择较少,缺点是SELECT语句复杂度增加,多个表之间的关联将是一个耗时的操作。另外,配置文件是死的,但是程序是活的,可以根据需要在程序中显示指定的搜索策略(可能经常需要在程序中显示指定的紧急左外链搜索)。要了解检索策略的配置效果,可以配置show_sql属性,查看Hibernate在程序运行时执行的sql语句。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Hibernate的检索策略小结

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情