via: http://www.cnblogs.com/amboyna/archive/2008/02/18/1072261.html
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中,只能有一个<set>配置成 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的检索策略,为读者提供了一条清晰的学习路径,重点分析了HIBERNATE中的抓取策略及其应用场景,帮助开发者更有效地管理和优化数据加载过程。 在...
### Hibernate参考文档详解 #### Hibernate简介 Hibernate是一个开源的对象关系映射(ORM)框架,用于Java持久化应用程序。它提供了一种将应用中的对象映射到数据库表的方式,并且简化了数据的检索和存储过程。在...
### Hibernate的检索策略详解 #### 一、概述 在Java持久化框架Hibernate中,检索策略是一种重要的机制,它主要用于控制对象何时以及如何加载到应用程序内存中。合理的检索策略不仅可以提高应用性能,还能简化代码...
描述中的链接指向了 CSDN 博客上的一篇文章,虽然具体内容无法在当前环境中查看,但我们可以推测这篇文章可能讲述了如何在 Spring 应用中集成 Compass 和 Hibernate,实现全文检索功能。通常,这样的集成会包括以下...
4. CGLIB和Javassist动态代理:Hibernate可以利用这两种库生成代理类,实现透明的懒加载和缓存策略,提高程序效率。 5. 事件和拦截器:开发者可以通过实现特定接口来监听和干预Hibernate的操作,如对象的保存、更新...
4. **会话(Session)与事务(Transactions)**:Hibernate中的Session是数据库操作的主要接口,负责对象的持久化和检索。事务管理则确保了数据的一致性,通常配合SessionFactory创建和提交。 5. **查询语言(HQL)...
- Hibernate Search则提供了全文检索能力。 总的来说,《Hibernate_3.2.0_Reference中文版》是深入学习和理解Hibernate框架的宝贵资源,涵盖了从基本概念到高级特性的全面介绍,对于Java开发人员来说,是提升...
综上所述,“Struts+Spring+Hibernate_upload_and_download.rar_Spring+Hibernate”这个压缩包涵盖了基于这三大框架的文件上传下载功能的实现,涉及了前端表单提交、后端处理逻辑、数据库交互以及文件的存储和检索等...
该文档版本为3.1.0.GA,深入探讨了如何将Apache Lucene集成到Hibernate ORM中,以实现高性能的全文检索。 ### 重要知识点概览: #### 1. 入门篇(Getting started) - **系统需求**:阐述了运行Hibernate Search...
在探讨“hibernate_reference 3.1.2 中文”这一主题时,我们主要聚焦于Hibernate框架3.1.2版本...随着技术的不断进步,Hibernate也在持续发展和完善,未来将会有更多高级功能和优化策略出现,值得我们持续关注和学习。
### Hibernate_Annotation参考...此外,还涉及了XML配置文件的使用和Hibernate工具的介绍,以及如何将Hibernate与Lucene结合使用以增强全文检索能力。这些知识点对于理解和掌握Hibernate_Annotation有着重要的意义。
在这个文件中,我们需要指定数据库的URL、用户名、密码、驱动类等信息,以及Hibernate的其他设置,如缓存策略、方言等。 2. **实体类(Entity)**:在Hibernate中,我们通过创建Java类来表示数据库中的表,这些类被...
2. 支持JPA 2.2:增加了对Java Persistence API 2.2规范的支持,包括新的注解和功能,如@NamedEntityGraph,提供了更灵活的数据检索策略。 3. 更强的二级缓存:引入了新的缓存插件支持,例如Infinispan和Ehcache,...
2. 映射(Mapping):实体与数据库表之间的映射关系由Hibernate的元数据(如.hbm.xml文件或注解)定义,包括字段映射、主键生成策略等。 3. Session:Session是Hibernate的主要工作接口,负责持久化操作,如保存、...
- **事务策略配置**:介绍了如何配置 Hibernate 的事务管理策略,以适应不同的应用服务器环境。 - **JNDI 绑定的 SessionFactory**:描述了如何将 SessionFactory 注册到 JNDI 上供其他应用使用。 - **与 JTA 的...
总的来说,《Hibernate Annotations中文帮助文档》是学习和掌握Hibernate ORM框架的宝贵资源,它详细阐述了如何利用注解进行对象关系映射,以及进行数据验证和全文检索,是Java开发人员必备的参考资料。
一、Hibernate检索方式 1. **HQL(Hibernate Query Language)**: HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是基于类和对象的。你可以通过HQL来查询、更新和删除对象,而无需关心底层的SQL语法。...
8. **Fetch策略**:HQL提供了不同的抓取策略,如immediate(立即加载)、delayed(延迟加载)等,用于控制何时加载关联对象或集合,以优化内存使用和查询性能。 #### 三、案例分析与应用技巧 假设我们需要查询所有...
- Hibernate支持单表继承、联合继承和表-per-class继承策略,使得基于类的层次结构可以映射到数据库。 13. **集合映射**: - Hibernate提供了List、Set、Map、Bag等多种集合类型的映射,以便处理数据库中的关联...