Hibernate中fetch和lazy介绍

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

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

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

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

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

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

用一对多来举例:

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

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

lazy大家应该都熟悉了,就是延迟加载,可以设置lazy = "true" , lazy = "false" lazy = "proxy" 。

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

lazy 和fetch配合使用:

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

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

3、当lazy="true"/lazy="false" fetch = "join"的时候,自己认为这个时候延迟已经没有什么用了,因为采用的是外连接查询,同时把一端和多端都查询出来了,延迟没有起作用。

时间: 2025-01-15 18:52:15

Hibernate中fetch和lazy介绍的相关文章

hibernate中fetch lazy

join 查询的时候,是用一条语句查处所有记录,包括关联表记录, select查出的是N+1条记录,两个都是差不多的,但是如果用了lazy=true,延迟加 载的话,select在查询时只会查出主表记录,也就是1,如果其他地方也用到了数据,此时就会自动在执行查询,查出N,可以降低内存消耗 .还有,hibernate是的session是轻量级的,创建和销毁都不花很多资源,查询数据也很快,这里fetch主要起这个作用,所以我们一般的情 况下要用select查询 fetch="join",已

Hibernate中,left join、inner join以及left join fetch区别(转)

标签: hibernate hql inner join left right 杂谈 分类: SQL 原文地址:http://m33707.iteye.com/blog/829725 Select From [Outer] Join On LEFT JOIN返回"left_table"中所有的行尽管在" right_table"中没有相匹配的数据. RIGHT JOIN返回"right_table"中所有的行尽管在"left_table

Hibernate中的延迟加载及fetch

Hibernate中的延迟加载 1.类级别的查询策略: lazy  :  true(默认值) false(立即加载) 2.多对一关联的查询策略: lazy:  proxy(默认值) no-proxy false 3.一对多  或多对多 lazy:true(默认值) false extra fetch:影响Hibernate针对底层SQL的生成 一.emp的映射文件的类级别设置非延迟加载 第二条会报空指针异常 二.emp的映射文件的类级别设置非延迟加载,其多对一属性也设置为非延迟加载 测试代码 三

Hibernate5-多对一双向关联-fetch="select",lazy="proxy",在一的一方的class标签中添加

1.创建项目,项目名称hibernatedemo28,目录结构如图所示 2.在项目中创建lib目录存储jar文件,目录结构如图所示 3.在src目录中创建实体类Forum,包名(com.mycompany.demo.bean),如图所示 4.实体类Forum的内容如下 package com.mycompany.demo.bean; import java.util.Set; public class Forum { private int fid; private String name; p

Hibernate中得fetch

fetch ,可以设置fetch = "select" 和 fetch = "join" 用一对多来举例:fetch = "select"是在查询的时候先查询出一端的实体,然后在根据一端的查询出多端的实体,会产生1+n条sql语句;fetch = "join"是在查询的时候使用外连接进行查询,不会差生1+n的现象. lazy大家应该都熟悉了,就是延迟加载,可以设置lazy = "true" , lazy =

Hibernate中load()和get()的区别,lazy加载和Eager加载的区别

Hibernate中load()和get()的区别: get():是直接操作数据库,通过id获取数据封装对象,如果没有数据则返回null: load():先在session缓存中查询,如果缓存中不存在,则延迟从数据库中查询,没发现符合条件的记录,则会抛出一个ObjectNotFoundException.在延迟查询中如果session关闭则会抛出no session异常 Hibernate中lazy加载和Eager加载的区别: Eager加载:将当前表和关联的其它表一并查询出来,select的语

Hibernate中的延迟加载(懒加载)

什么是懒加载? Hibernate提供了一种机制,即在设置了使用懒加载的情况下,查询某一条数据时不会立即访问数据库,因此不会返回指定对象,而是返回代理对象,该代理对象并不为null,它实际上是Hibernate自动实现的指定对象所属类的子类的对象,该对象具有默认值.当要使用真正对象的属性的时候才会访问数据库,这时代理对象会自动查询数据库中对应对象的数据并返回. 这样一来降低了程序对数据库访问次数和内存使用量.下面我们通过懒加载适用情况分析它究竟是如何做到的. 懒加载的适用情况? 1.获取某一个对

Hibernate中延迟加载和缓存

什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问该对象的属性时才会加载出相应的值.简答来说就是尽可能的减少查询的数据量. 如何配置延迟加载 在Hibernate中通过.hbm配置文件中的lazy属性来陪值,并且lazy属性出现的位置不同其作用和取值也不同.下面来详细介绍其在不同位置的不同取值和作用 类Class标签中的lazy: 在类标签Clas

浅谈Hibernate中映射集合属性以及主键和外键

首先说明一下什么叫主键以及外键. 主键和外键是对于数据库来说的,数据库的表才有主键外键的说法. 主键:主键是指标识某个表中唯一且非空的一条记录行的列,这个列中的值不允许有重复的值,用于确定一个表中的一条记录,实际上主键就是告诉别人:这个数据列是唯一的. 外键:引用另外一个表中的主键,在当前表中不一定为唯一的,但是在被引用表中一般唯一.对于关系型数据库来说(比如MySQL)外键是联系数据表之间的唯一方式,主要目的是控制存储在外键表中的数据. 建立外键的前提:本表的列必须与外键类型相同(外键必须是外