Hibernate中fetch和lazy介绍

fetch ,指定关联对象抓取的方式,能够设置fetch = "select" 和 fetch = "join"。select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每个对象发一个select查询,获取关联的对象,造成n+1次查询;而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会造成屡次查询。sql

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

(1)经过get()或load()方法取得数据。spa

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

(3)在映射文档中显式的声明链接抓取作为抓取策略并不会影响到随后的HQL查询。事务

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

 

用一对多来举例:get

fetch = "select"是在查询的时候先查询出一端的实体,而后在根据一端的查询出多端的实体,会产生1+n条sql语句;it

fetch = "join"是在查询的时候使用外链接进行查询,不会差生1+n的现象。配置

 

lazy你们应该都熟悉了,就是延迟加载,能够设置lazy = "true" , lazy = "false" lazy = "proxy" 。select

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

 

lazy 和fetch配合使用:

一、当lazy="true" fetch = "select" 的时候 , 这个时候是使用了延迟策略,开始只查询出一端实体,多端的不会查询,只有当用到的时候才会发出sql语句去查询 ;

二、当lazy="false" fetch = "select" 的时候 , 这个时候是使没有用延迟策略,同时查询出一端和多端,同时产生1+n条sql.

三、当lazy="true"/lazy="false" fetch = "join"的时候,本身认为这个时候延迟已经没有什么用了,由于采用的是外链接查询,同时把一端和多端都查询出来了,延迟没有起做用。

相关文章
相关标签/搜索