小小千想和您聊一聊

当前位置: 首页> 技术分享> Hibernate中fetch和lazy介绍

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+nsql语句;

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

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

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

  lazyfetch配合使用:

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

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

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

上一篇:PS一分钟打造大片效果

下一篇:抖音字体案例

QQ技术交流群

千锋Java开发官方②群
858309610

加入群聊

用户登录

手机号:

密码:

图形验证码:

点击切换

用户注册

手机号:

登录密码:

图形验证码:

点击切换

短信验证码:

获取验证码

忘记密码

1安全验证

2重置密码

手机号:

图形验证码:

短信验证码:

获取验证码

忘记密码

1安全验证

2重置密码

新密码:

确认新密码:

获取课程

添加小千老师微信,获取课程信息

如何获取课程?

一、需拥有此本教材

如没有,可点击下方入口购买当当购买入口京东购买入口

二、添加小千老师,发送拥有凭证,解锁课程资源

1.购买该教材的订单信息
2.拥有的实体书信息等

更换手机号

新手机号:

图形验证码:

短信验证码:

获取验证码