`
wangqiang6028
  • 浏览: 87337 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Hibernate的fetch相关问题

阅读更多

原文地址:http://qinhanbin.iteye.com/blog/520038
                  http://sun-gufeng-126-com.iteye.com/blog/629261

 

 

fetch ,可以设置fetch = "select" 和 fetch = "join"

用一对多来举例:
fetch = "select"是在查询的时候先查询出一端的实体,然后在根据一端的查询出多端的实体,会产生1+n条sql语句;
fetch = "join"是在查询的时候使用外连接进行查询,不会差生1+n的现象。

lazy大家应该都熟悉了,就是延迟加载,可以设置lazy = "true" , lazy = "false" lazy = "proxy" 。
我在这里要说的主要问题是lazy 和fetch配合使用的问题:
1、当lazy="true" fetch = "select" 的时候 ,这个时候是使用了延迟策略,开始只查询出一端实体,多端的不会查询,只有当用到的时候才会发出sql语句去查询 ;
2、当lazy="false" fetch = "select" 的时候 ,这个时候是使没有用延迟策略,同时查询出一端和多端,同时产生1+n条sql.
3、当lazy="true"/lazy="false" fetch = "join"的时候,自己认为这个时候延迟已经没有什么用了,因为采用的是外连接查询,同时把一端和多端都查询出来了,延迟没有起作用。

Hibernate的fetch="join"和fetch="select" 的一点分析 

fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;
而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
如果你的关联对象是延迟加载的,它当然不会去查询关联对象。


另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定join fetch某个关联对象

 

fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。

fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。

 

查询抓取(默认的)在N+1查询的情况下是不好的,因此我们可能会要求在映射文档中定义使用连接抓取:

 

<set name="permissions"
fetch="join">
<key column="userId"/>
<one-to-many class="Permission"/>
</set
<many-to-one name="mother" class="Cat" fetch="join"/>

 
在映射文档中定义的抓取策略将会有产生以下影响:

 

通过get()或load()方法取得数据。

只有在关联之间进行导航时,才会隐式的取得数据(延迟抓取)。

条件查询

在映射文档中显式的声明 连接抓取做为抓取策略并不会影响到随后的HQL查询。

通常情况下,我们并不使用映射文档进行抓取策略的定制。更多的是,保持其默认值,然后在特定的事务中,使用HQL的左连接抓取(left join fetch) 对其进行重载。这将通知 Hibernate在第一次查询中使用外部关联(outer join),直接得到其关联数据。 在条件查询 API中,应该调用 setFetchMode(FetchMode.JOIN)语句

其实这并不能说明hql能够按照配置文件设置的join进行抓取,这时第二级:topic-->forum 的抓取其实已经和hql没有关系了,因为前面已经产生了另一个select方式的抓取语句。
而是对象的关联获取,假如查询message时topic是设置为延迟加载的,那么在后面获取message.topic时,如topic.forum不延迟加载,那么topic-->forum会实现配置的join方式的抓取,这个显然和hql查询没有关系。

 

分享到:
评论

相关推荐

    Hibernate Fetch 的作用

    例如,在上面的代码片段中,通过`left outer join fetch parent.childs`语句,我们告诉Hibernate在加载`Parent`实体时,也一并加载所有相关的`Child`实体。这样,即使`Parent`实体的`childs`属性被标记为`lazy="true...

    hibernate N+1问题解决办法

    **标题:“Hibernate N+1问题解决办法”** 在Java开发中,使用Hibernate作为ORM框架时,我们可能会遇到一个性能上的问题,那就是著名的“N+1查询问题”。此问题源于不恰当的数据加载策略,可能导致数据库查询效率...

    Hibernate需要注意的问题

    《Hibernate需要注意的问题与数据源配置详解》 在Java企业级开发中,Hibernate作为一种流行的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,使用Hibernate的过程中,开发者需要特别注意一些关键点,以...

    hibernate aip hibernate aip

    8. **查询优化**:避免N+1查询问题,使用JOIN fetch提前加载关联数据,使用HQL或JPQL替代原生SQL以利用Hibernate的优化能力。 9. **错误处理和日志记录**:理解Hibernate常见的错误和异常,如 detached entity ...

    Hibernate 经典例子全

    在`hibernate_fetch_1`示例中,我们了解到Hibernate的加载策略,包括Eager Fetching(即时加载)和Lazy Fetching(延迟加载)。即时加载会在查询时一起加载关联的对象,而延迟加载则只在真正需要时才执行数据库查询...

    优化Hibernate性能的几点建议

    在使用Hibernate进行数据查询时,Fetch Size的设置对性能有着显著的影响。Fetch Size是指每次从数据库中取出的数据行数,默认情况下,Oracle数据库的JDBC驱动程序中的Fetch Size被设置为15。然而,将Fetch Size增加...

    Hibernate 参数配置详解

    例如,通过设置合适的 `hibernate.max_fetch_depth` 和 `hibernate.default_batch_fetch_size` 可以显著提升应用性能;而启用 `hibernate.generate_statistics` 则有助于我们更好地监控和分析应用性能瓶颈。此外,...

    hibernate源码下载

    文件名如`hibernate_fetch_5`、`hibernate_fetch_2`和`hibernate_fetch_4`暗示了对Hibernate数据获取策略的关注。在Hibernate中,Fetch策略包括EAGER(即时加载)和LAZY(延迟加载)。EAGER策略会立即加载关联的...

    让hibernate输出sql语句参数配置.doc

    hibernate.max_fetch_depth 参数用于设置单向关联(一对一,多对一)的外连接抓取(outer join fetch)树的最大深度。其取值为 0 到 3 之间,建议取值为 1 或 2。 8. hibernate.default_batch_fetch_size ...

    Hibernate教程15_关联关系中的CRUD Cascade_Fetch

    在本教程中,我们将深入探讨Hibernate中的关联关系及其在CRUD操作中的应用,特别是关于Cascade和Fetch策略。Hibernate是Java领域广泛使用的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来处理数据库交互...

    hibernate

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

    hibernate ppt 有问题 www.willvc.com.cn 能联系到我

    这里的标签再次强调了问题的核心,即与Hibernate相关的PPT内容存在困惑或错误,可能需要深入的技术支持。 【压缩包子文件的文件名称列表】:hibernate 这个列表仅包含了一个名为“hibernate”的文件,可能是PPT...

    hibernate配置参数大全

    7. **`hibernate.max_fetch_depth`**:定义Hibernate执行外连接获取关联对象时的最大深度。 - 示例: ```properties hibernate.max_fetch_depth=3 ``` 8. **`hibernate.default_batch_fetch_size`**:定义默认...

    Hibernate 1+N问题详解

    ### Hibernate 1+N问题详解 #### 一、Hibernate 1+N问题概述 在关系型数据库设计中,我们经常遇到“一对多”(1:N)这样的关系。而在对象关系映射(Object-Relational Mapping,简称ORM)框架如Hibernate中,这种...

    hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    Hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法是 Hibernate 框架中的一种常见问题。当我们在 Hibernate 中使用懒加载特性时,可能会遇到 LazyInitializationException 异常,这是因为 Hibernate 的 ...

    hibernate一对多项目

    在项目实践中,为了更好地理解这个例子,你可以打开`day56_01hibernate one2many`目录,查看具体代码,包括实体类、映射文件、DAO层、Service层以及相关的测试类。通过分析这些代码,你将能更好地掌握Hibernate一对...

    Hibernate 参数设置一览表.doc

    6. **hibernate.max_fetch_depth**:它限制了外连接加载关联的深度,防止因过于深的关联导致大量数据加载。一般建议设置在0到3之间。 7. **hibernate.default_batch_fetch_size**:设置批量获取关联对象的数量,...

    hibernate 关联表问题

    本文将深入探讨“Hibernate关联表问题”,基于给出的标题和描述,我们将重点讨论Hibernate中的多对多(Many-to-Many)关联映射。 在关系型数据库中,多对多关联是最复杂的一种关系,比如用户可以有多个角色,角色也...

    Hibernate-基础联表模板

    `@ManyToMany`注解用于定义这种关系,联表查询时,可能需要使用`JOIN FETCH`来一次性获取所有关联数据,以避免N+1问题。 8. **Fetch策略** Hibernate提供了EAGER和LAZY两种加载策略。EAGER策略会立即加载关联数据...

    Hibernate相关类包.zip_hibernate

    本压缩包"Hibernate相关类包.zip_hibernate"包含了进行Hibernate开发所需的各类库文件,使得开发者能够方便地在应用程序中管理数据库操作。以下是关于Hibernate框架及这些jar包的详细介绍。 1. **对象关系映射(ORM...

Global site tag (gtag.js) - Google Analytics