`
7tianle
  • 浏览: 92878 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate中lazy="false"怎么理解

阅读更多
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语句。
分享到:
评论
1 楼 wenjinglian 2009-03-17  
嘿嘿,不错

相关推荐

    Hibernate延时加载与lazy机制.doc

    Hibernate延时加载与lazy机制.docHibernate延时加载与lazy机制.doc

    Hibernate中文API大全

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

    英语资料,很有用的哦

    &lt;many-to-one name="systemSpecialtyCode" class="com.hibernate.model.SystemSpecialtyCode" fetch="select" lazy="false"&gt; &lt;column name="sp_code" length="4" /&gt; &lt;many-to-one name="systemGradeCode" class...

    hibernate总结

    1. 延迟检索(加载)映射文件中改变lazy a) Lazy的取值: i. Many-to-one 1. false 2. proxy 3. no-proxy ii. set 一对多 1. true  2. false  3. extra 根据对set容器的不同,可以产生高效的sql访问数据库 2....

    Hibernate使用技巧汇总

    property-ref:关联类中用于与主控类相关联的属性名,默认为关联类的主键属性名 单向一对多需在一方配置,双向一对多需在双方进行配置 8.lazy=false:被动方的记录由hibernate负责记取,之后存放在主控...

    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.4.4 立即检索(lazy属性为“false”)  16.4.5 批量延迟检索和批量立即检索(使用batch-size属性)  16.5 控制迫切左外连接检索的深度  16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的...

    Hibernate注解

    * 3.hilo 要在数据库中建立一张额外的表,默认表名为hibernate_unque_key,默认字段为integer类型,名称是next_hi(比较少用) * 例:@GeneratedValue(generator = "paymentableGenerator") * @GenericGenerator...

    SpringMVC3Demo:Hibernate+Spring+Spring MVC+Bootstrap

    PS: 在Hibernate的配置文件如Role.hbm.xml中,权限这里有很多我是lazy="false",因为用户登录的时候检查权限肯定会拿到对应Role下的所有权限,所以没必要开启lazy加载中,但是如果你想添加其他功能使懒惰决定是否...

    NHibernate的试验例子程序

    这个例子比较简陋 我的目标只是为了让把nhibernate整合到我的程序里面 网上找了好多资料 研究了好多天 ...修改一下&lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"&gt;这句 应该就能解决问题

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

     16.4.4 立即检索(lazy属性为“false”)  16.4.5 批量延迟检索和批量立即检索(使用batch-size属性)  16.5 控制迫切左外连接检索的深度  16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的...

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

     16.4.4 立即检索(lazy属性为“false”)  16.4.5 批量延迟检索和批量立即检索(使用batch-size属性)  16.5 控制迫切左外连接检索的深度  16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的...

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

     16.4.4 立即检索(lazy属性为“false”)  16.4.5 批量延迟检索和批量立即检索(使用batch-size属性)  16.5 控制迫切左外连接检索的深度  16.6 在应用程序中显式指定迫切左外连接检索策略  16.7 属性级别的...

    Hibernate_Annotation关联映射

    和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+...

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

    default-lazy-init="false" default-autowire="byName"&gt; &lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"&gt; &lt;property name="driverClass" value=...

    ibatis 开发指南(pdf)

    所谓“半自动”,可能理解上有点生涩。纵观目前主流的ORM ,无论Hibernate 还是 Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全 套映射机制。程序员往往只需定义好了POJO ...

    D语言的ORM框架HibernateD.zip

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

    cms后台管理

    接下来是配置hibernate中jc_mycontent表的配置文件 &lt;?xml version="1.0"?&gt; &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" ...

Global site tag (gtag.js) - Google Analytics