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

Hibernate的fetch属性

阅读更多
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 的作用

    在深入探讨Hibernate Fetch的作用之前,我们首先需要理解Hibernate框架本身以及其在持久化领域的重要性。Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用,它提供了将数据库记录映射到对象的方法,使得...

    Hibernate集合属性的延迟加载.doc

    此外,还可以通过设置 `&lt;set&gt;` 标签的 `fetch` 属性来控制查询策略,比如使用 `fetch="subselect"` 来预加载集合的大小,或者使用 `batch-size` 来批量加载一定数量的关联记录,进一步优化性能。 总的来说,...

    hibernate 配置属性参数详情(全)

    以下是一些关键的Hibernate配置属性及其用途: 1. **hibernate.dialect**:这个属性用于指定针对特定数据库的方言类,以便Hibernate能生成优化过的SQL。例如,如果你使用的是MySQL,你可以设置为`org.hibernate....

    hibernate配置属性参数[定义].pdf

    以下是一些主要的 Hibernate 配置属性及其用途: 1. `hibernate.dialect`:这个属性指定了数据库方言(Dialect),确保 Hibernate 能够生成适应特定数据库的优化 SQL 语句。例如,如果使用 MySQL 数据库,可以设置...

    Hibernate映射集合属性List

    同时,我们还可以通过`fetch`属性设置级联操作,如`CascadeType.ALL`会将集合中的所有操作都级联到关联的对象上。 综上所述,Hibernate映射集合属性List是通过注解或XML配置来实现的,它可以简化数据库操作,使代码...

    Hibernate_3.2属性文档介绍_中文

    标题和描述均提到了“Hibernate_3.2属性文档介绍_中文”,这表明文档主要聚焦于Hibernate 3.2版本的属性配置与使用说明。Hibernate是Java领域内一个流行的开源对象关系映射(ORM)框架,它允许开发人员将数据库表...

    Hibernate 对集合属性的操作.zip_hibernate

    如果希望在实体加载时就加载关联的集合,可以使用`fetch="join"`属性。 5. **级联操作**:通过`cascade`属性,我们可以指定如何处理关联对象的保存、更新、删除等操作。例如,`cascade="save-update"`表示当父对象...

    hibernate 中的lazy属性祥解.txt

    在Hibernate中,当设置关联属性的`fetch`或`lazy`属性为`true`时,表示该关联属性采用懒加载方式。这意味着,在获取主对象时,Hibernate不会立即加载与其关联的子对象。例如,在用户(User)与帖子(Post)之间的多...

    hibernate.cfg.xml中配置信息详解

    Hibernate.max_fetch_depth 属性用于控制 Hibernate 的外连接抓取(outer join fetch)树的最大深度。该属性的值可以是 0 到 3 之间的整数,建议的取值是 0 到 3。 hibernate.default_batch_fetch_size Hibernate....

    hibernate源码下载

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

    Hibernate3的配置参数汇总

    1. **Hibernate JDBC属性**: - `hibernate.connection.driver_class`:指定JDBC驱动类,例如`org.postgresql.Driver`用于PostgreSQL数据库。 - `hibernate.connection.url`:JDBC连接URL,用于指定数据库的地址和...

    hibernate

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

    Hibernate 参数配置详解

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

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

    默认情况下,Hibernate使用懒加载(Lazy Fetch),只有在实际访问关联属性时才会加载。立即加载(Eager Fetch)则会在查询主实体时一并加载关联实体。`@ManyToOne(fetch = FetchType.EAGER)`表示多对一关系的加载...

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

    hibernate.use_identifer_rollback 参数用于如果开启,在对象被删除时生成的标识属性将被重设为默认值。其取值为 true 或 false。 13. hibernate.use_sql_comments hibernate.use_sql_comments 参数用于如果开启,...

    hibernate关联关系总结

    在Hibernate中,可以通过@OneToOne注解来定义这种关系,可以指定fetch属性来控制加载策略,并通过cascade属性设置级联操作。同时,可以使用@PrimaryKeyJoinColumn注解来指定主键的关联。 2. **一对多关联...

    hibernate源码 直接使用

    3. **关联映射**: 对于一对一、一对多和多对多关系,需要在实体类中添加关联注解,如@OneToOne、@OneToMany、@ManyToMany,并设置fetch属性和cascade属性来控制加载和操作行为。 4. **SessionFactory和Session**: ...

    优化Hibernate性能的几点建议

    这里的关键是`hibernate.jdbc.fetch_size`属性,它控制着每次查询从数据库中获取的数据量。通过设置合理的值(例如50),可以有效减少网络传输开销,同时避免过多内存消耗。 #### 二、利用二级缓存提高查询效率 ...

    hibernate配置参数大全

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

    Hibernate 参数设置一览表.doc

    11. **hibernate.use_identifier_rollback**:如果设置为`true`,在删除对象后,Hibernate会将标识属性重置为默认值,这有助于管理对象的状态。 12. **hibernate.use_sql_comments**:启用后,Hibernate会在SQL语句...

Global site tag (gtag.js) - Google Analytics