`

详细讲解在Hibernate中检索策略的应用

    博客分类:
  • Java
阅读更多
转载至:http://www.cn-java.com/www1/?action-viewnews-itemid-3791
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的检索策略包括类级别检索策略和关联级别检索策略。

类级别检索策略有立即检索和延迟检索,默认的检索策略是立即检索。在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中文参考文档pdf

    4. **Transaction管理**:讲解如何在Hibernate中处理事务,包括手动和自动提交事务,以及回滚和隔离级别。 5. **Querying数据**:详述了HQL(Hibernate查询语言)和Criteria API,它们是用于检索数据的主要方式,...

    Hibernate4.1.11中文手册

    《Hibernate4.1.11中文手册》是针对Java开发者的重要参考资料,它详细阐述了Hibernate框架在4.1.11版本中的各项功能和用法。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程方式来...

    Hibernate 简单 PPT 总结

    - "05-2018-7-9-Hibernate-配置数据库连接池.pptx"可能介绍了如何在Hibernate中配置和使用数据库连接池,以提高应用性能。 - "2018-7-24-Hibernate-配置表关系.pptx"和"06-2018-7-9-Hibernate-对象关系映射文件.pptx...

    Hibernate开发实战讲解(源代码)

    通过《Hibernate开发实战讲解》的学习,读者不仅可以掌握Hibernate的基本用法,还能了解到如何在实际项目中有效地运用Hibernate,解决数据库操作中的各种问题,从而提升Java EE应用的开发效率和质量。结合源代码实践...

    HIbernate PPT

    【描述】:该资料包详细讲解了Hibernate如何与Struts2和Spring进行集成,这是企业级Java开发中常见的技术栈组合。它还涉及了Hibernate的SQL注释配置,这对于自定义数据库查询非常有用。此外,它讨论了Hibernate的...

    Hibernate5用户手册中文版

    Hibernate是一个开源的Java持久化框架...整体来说,Hibernate5用户手册中文版是一份极为详尽的参考资料,涵盖了Hibernate框架在使用过程中的方方面面,从基础概念到高级特性,为Java开发者提供了一整套的ORM解决方案。

    Hibernate ORM 5.3.7.Final User Guide

    11. 数据抓取(Fetching):手册解释了在Hibernate中抓取数据的不同策略及其适用场景。 12. 批处理(Batching):这部分提供了在Hibernate中如何有效执行批处理操作的信息。 13. 缓存(Caching):涵盖了Hibernate缓存...

    涂鸦hibernate精彩讲解

    本讲解将深入探讨Hibernate的核心概念、配置、实体映射以及其在实际开发中的应用。 ### 一、Hibernate概述 1. **ORM概念**:ORM(Object-Relational Mapping)是将关系数据库的数据映射到对象模型的一种技术,通过...

    Hibernate中文参考文档V3.2(HTML)

    5. **Transaction管理**:在Hibernate中,事务可以通过Session进行管理,提供了begin、commit、rollback等方法,符合ACID特性,确保数据的一致性。 6. **Criteria查询**:除了SQL,Hibernate提供了Criteria API进行...

    Hibernate3.2官方中文参考手册

    这本书详细介绍了Hibernate的核心概念和技术,帮助读者理解如何在Java应用中高效地管理和持久化数据。 首先,从入门知识部分,读者可以了解到Hibernate是什么,它为何在Java世界中如此重要。Hibernate是一个开源的...

    传智播客 hibernate笔记(word+pdf+源码)

    此外,可能还会涉及到 Hibernate 的检索策略,如 HQL(Hibernate Query Language)查询、Criteria 查询和 Criteria API,以及一对多、多对一、一对一和多对多的关联映射。 【pdf讲义】通常会以更加系统和结构化的...

    Hibernate5.2.11高清版,最新版本

    持久化上下文(PersistenceContexts)介绍了Hibernate管理对象生命周期的机制,以及如何在应用中处理这些持久化上下文。 刷新机制(Flushing)涉及Hibernate在何时将数据更改实际写入数据库,包括其内部的刷新策略...

    Pro Hibernate 3 DAVE MINTER AND JEFF LINWOOD.pdf

    此外,还讨论了Hibernate在不同应用服务器上的部署策略,以及如何集成到现有的Java EE环境中。 #### 4. 映射策略与实体关系 Hibernate提供了多种映射策略,如一对一、一对多、多对一和多对多映射,书中深入讲解了...

    Hibernate Search in action (pdf && code)

    Hibernate Search是Hibernate ORM的一个扩展,它将全文搜索的功能集成到Java应用中,使得在大量数据中进行高效、精准的检索成为可能。 本书首先会介绍Hibernate Search的基本概念,包括什么是全文搜索引擎、如何与...

    Hibernate开发指南

    3.3 事务管理:讲解Hibernate的事务API,包括Transaction接口,以及如何在事务中进行数据操作以确保数据一致性。 四、查询语言 4.1 HQL(Hibernate Query Language):介绍Hibernate特有的SQL方言,如何编写HQL...

    hibernate课件

    在IBMHibernateAndSpring.ppt中,可能讲解了如何将Hibernate集成到Spring框架中,利用Spring的依赖注入和事务管理能力,使应用更加健壮和易于测试。 通过学习这些内容,你可以掌握Hibernate的基本使用,并能够将其...

    hibernate中文教程参考文档

    在Hibernate中,事务管理是通过SessionFactory创建的Session对象实现的。Session的beginTransaction()方法启动事务,commit()或rollback()方法结束事务。事务的隔离级别和传播行为也可根据需求进行设置。 **6. 第二...

Global site tag (gtag.js) - Google Analytics