`
7tianle
  • 浏览: 95189 次
  • 性别: 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 Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

    Hibernate延迟加载

    `lazy="true"`会在集合被访问时加载,`lazy="false"`会在加载实体时同时加载集合,而`lazy="extra"`提供更智能的加载策略,推荐在实际应用中使用。 4. 单端关联(One-to-one, many-to-one)的延迟加载:`...

    hibernate 延迟加载.docx

    当使用Hibernate的`Session.load()`方法或在映射文件中设置了`lazy="true"`时,Hibernate并不会立即从数据库中获取关联对象的所有数据,而是创建一个代理对象。这个代理对象在需要访问其属性时才会执行实际的数据库...

    Hibernate实战笔记

    例如,在一个`Customer`与多个`Order`的关联关系中,如果数据库中有`n`个客户,则Hibernate将执行`n+1`次查询,其中`1`是为了获取所有的客户信息,而额外的`n`次查询则是为了获取每个客户的订单信息。 - **立即...

    Hibernate中文API大全

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

    hibernate结构框架及组要实现类的深入分析

    例如,`lazy="true"` 表示延迟加载,而 `lazy="false"` 表示立即加载。在类级别上,如果设置 `lazy=false`,则在查询时会自动加载关联的对象;而在属性级别上,它控制单个属性的加载行为。 **级联操作(Cascade)**...

    hibernate

    根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...

    Hibernate 多表映射关系配置

    对多关系在 Hibernate 中,多对多关系通常涉及到一个中间表来存储两个实体之间的关联。以下是如何配置 Hibernate 的多对多映射关系。 1. 数据库建表 假设我们有两张表,`users` 和 `roles`,它们通过 `user_roles` ...

    hibernate 最常见的主建配置

    在Hibernate中,单主键且没有外键关联是最常见的一种情况。这种配置方式适用于那些独立存在的实体对象,它们通常只有一个标识符(ID)来唯一确定数据库中的每一行记录。 **配置示例**: ```xml &lt;hibernate-mapping...

    hibernate延迟机制分析

    例如,在上述例子中,将`lazy="false"`改为`lazy="true"`,Hibernate会在查询部门(Dept)的同时加载其员工(Emps)集合。虽然这样可以避免`LazyInitializationException`,但可能会导致大量的数据一次性加载到内存...

    Hibernate延迟加载以及利用Spring

    在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正需要数据时才加载数据,而不是一开始就加载所有数据。这种策略能够有效地减少...

    hibernate set 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象模型中的集合类,如List、Set、Map等。这允许我们在Java代码中操作对象集合,而Hibernate负责处理底层的SQL查询和数据存储。本文将深入探讨`...

    MyEclipse中hibernate的配置

    ### MyEclipse中Hibernate的基本配置步骤与理解 #### 一、引言 随着软件开发行业的不断发展,ORM(Object-Relational Mapping,对象关系映射)技术已成为连接对象模型与关系型数据库的重要桥梁之一。其中,...

    整理的Hibernate

    7. **懒加载与Eager加载**:懒加载(lazy="false")和Eager加载(lazy="true")是Hibernate对象关联加载的两种模式。懒加载只在真正需要时加载关联对象,而Eager加载则在加载主对象时同时加载关联对象。 通过理解...

    Hibernate较完整资料

    3. `lazy="false"` 表示实体加载策略,不启用延迟加载,意味着关联的对象在加载时会立即加载。 4. `&lt;id&gt;` 元素定义主键,`generator` 属性指定生成策略,`identity` 表示由数据库自动生成 ID。 5. `&lt;property&gt;` 元素...

    Hibernate总结

    - **延迟检索**(`lazy="false"`):不立即执行SQL,返回代理对象。 2. **关联的检索策略** - **一对多和多对多**:`lazy`和`outer-join`属性决定检索方式。 - **多对一和一对一**:`outer-join`属性和关联类的`...

    Hibernate3性能优化方案

    要启用二级缓存,需要在Hibernate配置文件中指定一个缓存提供商,并在实体映射文件中指定缓存策略。 ```xml &lt;!-- hibernate.cfg.xml --&gt; &lt;property name="hibernate.cache.provider_class"&gt;org.hibernate.cache....

    hibernate的使用心得

    对于集合属性的延迟加载问题,可以通过在映射文件中设置`lazy="false"`关闭延迟加载,或者使用`fetch join`。然而,`fetch join`有一些限制,比如不应与`setMaxResults()`或`setFirstResult()`一起使用,也不能与...

    Hibernate懒加载之&lt;class&gt;标签上的lazy

    Hibernate懒加载(Lazy Loading)是一种优化策略,其核心思想是在真正需要使用对象的属性时才去加载它们,而不是在初始化对象时一次性加载所有数据。这有助于减少不必要的数据库交互,提高系统性能。 在Hibernate中...

Global site tag (gtag.js) - Google Analytics