`
高级java工程师
  • 浏览: 395831 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate中lazy =true

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

相关推荐

    当设置lazy=true时,怎样使用extjs和Hibernate

    NULL 博文链接:https://afuer.iteye.com/blog/1508008

    Hibernate中文API大全

    注意:在Hibernate3中,第二个要求并非是Hibernate强制必须的。但最好这样做。 你不能使用一个IdentifierGenerator产生组合关键字。一个应用程序必须分配它自己的标识符。 使用&lt;composite-id&gt; 标签(并且内嵌元素...

    hibernate总结

    &lt;set name="emps" inverse ="true" lazy="true" cascade="none" batch-size="2" fetch="join" &gt; &lt;column name="deptid" /&gt; &lt;one-to-many class="org.wllt.www.po.Emp" /&gt; &lt;/hibernate-mapping&gt; ...

    ssh(structs,spring,hibernate)框架中的上传下载

     此外lazy="true"说明地返回整个Tfile对象时,并不返回fileContent这个字段的数据,只有在显式调用tfile.getFileContent()方法时才真正从数据库中获取fileContent的数据。这是Hibernate3引入的新特性,对于包含重量...

    Hibernate注释大全收藏

    @Basic(fetch = FetchType.LAZY) String getDetailedComment() { ... } // persistent property @Temporal(TemporalType.TIME) java.util.Date getDepartureTime() { ... } // persistent property @Enumerated(Enum...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     16.3.2 延迟检索(lazy属性为默认值“true”)  16.3.3 增强延迟检索(lazy属性为“extra”)  16.3.4 批量延迟检索和批量立即检索(使用batch-size属性)  16.3.5 用带子查询的select语句整批量初始化orders...

    Hibernate注解

    * insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true) * updatable 可选,该列是否作为生成的update语句中的一个列(默认值true) * columnDefinition 可选,为这个特定列覆盖sql ddl片段(这...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     16.3.2 延迟检索(lazy属性为默认值“true”)  16.3.3 增强延迟检索(lazy属性为“extra”)  16.3.4 批量延迟检索和批量立即检索(使用batch-size属性)  16.3.5 用带子查询的select语句整批量初始化orders...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     16.3.2 延迟检索(lazy属性为默认值“true”)  16.3.3 增强延迟检索(lazy属性为“extra”)  16.3.4 批量延迟检索和批量立即检索(使用batch-size属性)  16.3.5 用带子查询的select语句整批量初始化orders...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     16.3.2 延迟检索(lazy属性为默认值“true”)  16.3.3 增强延迟检索(lazy属性为“extra”)  16.3.4 批量延迟检索和批量立即检索(使用batch-size属性)  16.3.5 用带子查询的select语句整批量初始化orders...

    维生药业小项目 SSH简单学习项目

    &lt;prop key="hibernate.format_sql"&gt;true &lt;prop key="hibernate.hbm2ddl.auto"&gt;update &lt;property name="packagesToScan"&gt; &lt;value&gt;com.sixth.**.model &lt;!-- 事务配置 --&gt; ...

    属性延迟加载

    修改映射配置文件,将需要延迟加载的字段增加lazy属性并设置成true; 2.与实体和集合类型的延迟加载不同,Hibernate3属性延迟加载机制在配置外,还需要用类增强器对二进制Class文件进行强化处理(借助ANT)

    OA项目SSH整合框架

    1,对于集合属性,默认是lazy="true"的,在第一次使用时才加载。 2,但在加载时,如果Session已经关掉了就会抛LazyInitializationException异常 二,集成 Spring 与 Struts2.1.8.1 1,在web.xml配置监听器...

    SpringMVC-SSH全注解

    default-lazy-init="true"&gt; &lt;!-- 扫描包 --&gt; &lt;context:component-scan base-package="com.org.core"/&gt; &lt;bean id="jspViewResolver" class="org.springframework.web.servlet.view....

    ibatis 开发指南(pdf)

    ibatis 开发指南 ibatis Quick Start............................................................................................ 5 准备工作.................DOCTYPE sqlMapConfig PUBLIC "-//iBATIS....

    cms后台管理

    default-lazy-init="true"&gt; …… &lt;bean id="cms_content_list" class="com.jeecms.cms.action.directive.ContentListDirective"/&gt;(声明标签对应的类) &lt;bean id="staticPageSvc" class=...

    Open_Session_In_View详解.doc

    在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛...

    D语言的ORM框架HibernateD.zip

    HibernateD 是 D 语言的 ORM 框架,类似 Java 的 Hibernate,示例代码:import hibernated.core; // Annotations of entity classes class User {  long id;  string name;  Customer customer;  @...

    java面试题

    配置了lazy="true"一定会懒加载吗? 答:不一定,如果在配置中你也使用了fetch属性的话此时lazy就会失效。 Hibernate数据库标识与主键之间的认识? 答:标识是为了方便和简介映射文件,主键是为了让数据不会重复。 ...

Global site tag (gtag.js) - Google Analytics