懒加载与急加载FetchType.LAZY&FetchType.EAGER的区别和使用?

简介: 1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。

1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。3、比方User类有两个属性,name跟address,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户的所有资料都加载到对象中,于是有了这两种加载模式。

我们来用一个典型的案例作对比
一个用户有编号 用户名 ......和角色,正常情况下用户登录后不需要查询角色,但是现在我们想要查询到角色 一个用户可以有多个角色,员工角色是两张表 ,一般我们在项目配置中都是配置延迟加载(懒加载)

<configuration>
<!-- 启用延迟加载 -->
 <settings>
    <setting name="lazyLoadingEnabled" value="true" />
    <!--&lt;!&ndash;设置为false之后表示在访问many方的属性(非关联的对象的属性)的时候不要触发延迟加载&ndash;&gt;-->
    <setting name="aggressiveLazyLoading" value="false" />
    <!--&lt;!&ndash;当访问Object中的clone方法的时候触发延迟加载&ndash;&gt;-->
    <setting name="lazyLoadTriggerMethods" value="clone" />
</settings>

</configuration>
img_604f6a1c199976dbc68a083905a4bf01.png
延迟加载

我们在项目中有查询角色的sql(根据员工编号查询角色)

<collection property="roles" ofType="Role"
    select="com.jd.wms.mapper.RoleMapper.selectRolesByEmployeeId"
    column="id">
</collection>

调用RoleMapper里的方法查询角色


img_ef8d13e0054a6eebf36380a6b5a11e1b.png
EmployeeMapper.xml

sql查询出结果每一个用户id编号对应的角色

<select id="selectRolesByEmployeeId" resultMap="base_mapper">
    select r.* from t_employees_roles er join t_role r on er.role_id=r.id 
    where er.employee_id = #{empId}
</select>
img_10f9440e6d5870377e55541b3fb9cd52.png
RoleMapper.xml

查询出的结果是

img_cf58f30d6a4f2b61fb3ca3ed1611d2b4.png
查询结果

我们明明写了查询语句但是却没有查询到原因就是我们启用了延迟加载

现在我们的需求是需要把角色也显示出来怎么破?
这时我们就需要使用fetchType.eager(急加载)
添加一个属性fetchType="eager"

<collection property="roles" ofType="Role"   
 select="com.jd.wms.mapper.RoleMapper.selectRolesByEmployeeId"
 column="id" fetchType="eager">
</collection>
img_954fa83097467ea86fbc56b1e9fa000e.png
fetchType.eager

这时我们发送请求得到的结果就是

img_0c761209657e1c8fc37d9e4dfea142e9.png
目录
相关文章
|
3月前
|
SQL XML Java
MyBatis的lazy-loading是什么?
MyBatis的lazy-loading是什么?
18 0
|
3月前
|
存储 JSON 数据格式
Spartacus i18n Resource 的默认加载和 Lazy Load 两种方式的比较
Spartacus i18n Resource 的默认加载和 Lazy Load 两种方式的比较
17 0
|
9月前
|
数据采集 搜索推荐 UED
实现懒加载
懒加载是一种非常 useful 的技术,可以极大提高用户体验和网页性能,但也有一定的弊端,需要权衡选择。一般来说,对于加载的数据较多,页面性能和流量较为关注的场景,懒加载是一个不错的方案。但如果对 SEO 优化要求较高,或者加载的数据较少,也可以不使用懒加载
47 0
|
Java Spring 容器
Spring系列(五):@Lazy懒加载注解用法介绍
@Lazy 懒加载注解的概念 SpringIoC容器会在启动的时候实例化所有单实例 bean 。如果我们想要实现 Spring 在启动的时候延迟加载 bean,即在首次调用bean的时候再去执行初始化,就可以使用 @Lazy 注解来解决这个问题
Spring系列(五):@Lazy懒加载注解用法介绍
|
Java Spring
@Lazy注解简单理解
@Lazy注解简单理解
309 0
SAP Spartacus CMS Component的lazy loading懒加载方式
SAP Spartacus CMS Component的lazy loading懒加载方式
126 0
SAP Spartacus CMS Component的lazy loading懒加载方式
|
Web App开发 XML 存储
SAP Fiori里的List是如何做到懒加载Lazy load的
今天一同事问我这个问题:S/4HANA Fiori应用里的列表,一旦Scroll到底部就会自动向后台发起新的请求把更多的数据读取到前台显示。 以Product Master这个应用为例,我点击搜索之后,结果区域显示当前系统一共有140个product,但是只有前25个返回并显示在浏览器里。
130 0
SAP Fiori里的List是如何做到懒加载Lazy load的
|
JavaScript 前端开发 Shell
SAP Spartacus 的延迟加载 Lazy load 设计原理
SAP Spartacus 的延迟加载 Lazy load 设计原理
132 0
|
JavaScript 前端开发
SAP UI5 JavaScript文件的lazy load - 懒加载
Created by Wang, Jerry, last modified on May 18, 2016
93 0
SAP UI5 JavaScript文件的lazy load - 懒加载