`
laiseeme
  • 浏览: 124743 次
  • 性别: Icon_minigender_2
  • 来自: 沈阳
社区版块
存档分类
最新评论

Hibernate的检索策略小结<转帖>

阅读更多
  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语句。
分享到:
评论

相关推荐

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List&lt;Map&lt;String, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List&lt;Map&lt;String, Object&gt;...

    MLDN框架笔记大全

    MLDN框架笔记大全&lt;br&gt;JSP+JDBC_假分页 &lt;br&gt;02 JSP+JDBC_真分页(基于MySQL数据库分页)...试学下载 &lt;br&gt;12 Struts + DAO分页 &lt;br&gt;13 Hibernate入门(上) &lt;br&gt;14 Hibernate入门(下) &lt;br&gt;15 Hibernate数据检索(HQL) 试学下载

    hibernate 教程

    大小写敏感性(Case Sensitivity)&lt;br&gt;11.2. from 子句&lt;br&gt;11.3. 联合(Associations)和连接(joins)&lt;br&gt;11.4. select子句&lt;br&gt;11.5. 统计函数(Aggregate functions)&lt;br&gt;11.6. 多态(polymorphism)查询&lt;br&gt;11.7. ...

    mysql+jdbc+jsp+Hibernate3.2+tomcattomcat5.028成功测试

    column="EVENT_ID"&gt;&lt;br&gt; &lt;generator class="native"/&gt;&lt;br&gt; &lt;/id&gt;&lt;br&gt; &lt;property name="date" type="timestamp" column="EVENT_DATE"/&gt;&lt;br&gt; &lt;property name="title"/&gt;&lt;br&gt; &lt;/class&gt;&lt;br&gt;&lt;br&gt;&lt;/hibernate-mapping&gt;&lt;br&gt;...

    hibernate学习

    &lt;br&gt;&lt;br&gt;搜集清单和说明&lt;br&gt;1:hibernate学习源码,这是我以前做练习的代码,希望对感兴趣的朋友&lt;br&gt;有些帮助。&lt;br&gt;2:hibernate_reference.pdf,我以前学习参看的资料。&lt;br&gt;3:hibernate源码.zip,hibernate的源...

    hibernate

    大小写敏感性(Case Sensitivity)&lt;br&gt;11.2. from 子句&lt;br&gt;11.3. 联合(Associations)和连接(joins)&lt;br&gt;11.4. select子句&lt;br&gt;11.5. 统计函数(Aggregate functions)&lt;br&gt;11.6. 多态(polymorphism)查询&lt;br&gt;11.7. ...

    MyEclipse 6 Java EE 开发中文手册 第九章完整

    第九章 开发Struts 1.x应用 145&lt;br&gt;9.1 介绍 145&lt;br&gt;9.2 创建Struts项目 147&lt;br&gt;9.2.1 创建Web项目 148&lt;br&gt;9.2.2 ... 175&lt;br&gt;9.6 小结 176&lt;br&gt;9.7 参考资料 176 &lt;br&gt;&lt;br&gt;第九章的内容终于完整了,昨天发的那个还不完整

    spring+struts+hibernate+dwr+jstl做的实例

    2.7.6rc1.jar&lt;br&gt;asm.jar&lt;br&gt;asm-attrs.jar&lt;br&gt;cglib-2.1.3.jar&lt;br&gt;commons-collections-2.1.1.jar&lt;br&gt;commons-logging-1.0.4.jar&lt;br&gt;dom4j-1.6.1.jar&lt;br&gt;ehcache-1.1.jar&lt;br&gt;hibernate3.jar&lt;br&gt;jaas.jar&lt;br&gt;jaxen-...

    ( maven中整合Spring+hibernate的pom.xml文件的配置.doc )

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;3.3.0.CR2&lt;/version&gt; &lt;exclusions&gt; &lt;exclusion&gt; &lt;groupId&gt;org.slf4j&lt;/groupId&gt; &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt; ...

    jersey 1.17+spring 3.1.0.RELEASE+hibernate 3.3.1.GA maven 配置文

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;3.3.1.GA&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-...

    Hibernate Spatial 4 教程

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-spatial&lt;/artifactId&gt; &lt;version&gt;4.0&lt;/version&gt; &lt;/dependency&gt; ... &lt;/dependencies&gt; 三、 配置 Spatial Dialect 要使用地理数据支持,需要在 ...

    HIBERNATE检索策略

    标题:“HIBERNATE检索策略” 描述:本文深入解析了HIBERNATE的检索策略,为读者提供了一条清晰的学习路径,重点分析了HIBERNATE中的抓取策略及其应用场景,帮助开发者更有效地管理和优化数据加载过程。 在...

    java8+tomcat8+struts2.5+spring4.3+hibernate5.2框架搭建详细过程

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;${hibernate.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.hibernate.javax.persistence&lt;/groupId&gt; ...

    springmvc+spring+mybatis集成框架的环境搭建

    &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;4.3.0.Final&lt;/version&gt; &lt;/dependency&gt; ``` - **Hibernate JPA API:** ``` &lt;dependency&gt; &lt;groupId&gt;org.hibernate.javax...

    Spring4 + Hibernate5详细maven构建.docx

    - **Hibernate版本**: `&lt;hibernate.version&gt;5.0.8.Final&lt;/hibernate.version&gt;` 指定了Hibernate ORM的具体版本号。 **1.2 Spring核心依赖** ```xml &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; ...

    Struts+Spring+Hibernate实现上传下载(MyEclipse版)

    在天极网看了一篇用JBuilder实现的“Struts+... &lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;所用软件或包的版本: &lt;br&gt;Struts 1.2 &lt;br&gt;Spring 1.2.8 &lt;br&gt;Hibernate 3.1 &lt;br&gt;Oracle 9i &lt;br&gt;MyEclipse4.1.1 &lt;br&gt;&lt;br&gt;具体代码如下: &lt;br&gt;TFile类:

    jive.chm

    &lt;br&gt; 2 jcs学习笔记 &lt;br&gt; 3 关于Hibernate的Cache问题 &lt;br&gt; 4 用缓冲技术提高JSP应用的性能和稳定性 &lt;br&gt; 5 SwarmCache入门 &lt;br&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;源代码研究&lt;br&gt; 1 Jive中的全局配置 &lt;br&gt; 2 Jive源代码情景分析-index....

    struts_hibernate框架权限管理系统

    &lt;br&gt;&lt;br&gt;mysql初始数据库用户名:root,密码:1234&lt;br&gt;&lt;br&gt;其它数据库请相应修改hibernate.cfg.xml这映射文件为与你数据库相匹配&lt;br&gt;&lt;br&gt;注释:&lt;br&gt;1,默认配置为mysql5.0&lt;br&gt;hibernate.cfg.xml.mssql为Ms sqlserver2000...

    hibernate集成memcached所需jar

    memcached-2.5-sources.jar、hibernate-memcached-1.2.2-sources.jar、spy-2.4.jar这三个jar不太好找,剩下两个commons-codec和slf4j-log4j直接maven配置一下就行 &lt;dependency&gt; &lt;groupId&gt;org.slf4j&lt;/groupId&gt; ...

    SSH例子

    &lt;br&gt;功能:使用dwr完成在客户端无刷新的分页排序等&lt;br&gt;&lt;br&gt;工具:MyEclipse 6.0,数据库SQLSERVER 2000&lt;br&gt;&lt;br&gt;数据在SQL文件夹下,Jobs是pubs数据库自带的&lt;br&gt;&lt;br&gt;主要的三个页面,emp是详细的,另两个是简单的复制修改,...

Global site tag (gtag.js) - Google Analytics