懒加载与急加载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
目录
相关文章
|
运维 Java 大数据
一步步教你激活Termius(针对Termius持续更新导致失效解决)
一步步教你激活Termius(针对Termius持续更新导致失效解决)
一步步教你激活Termius(针对Termius持续更新导致失效解决)
|
Kubernetes 测试技术 容器
实践 Fake ClientSet 单元测试
在 Kubernetes 相关的开发中,client-go 是最常用的,对于 client-go 相关的代码我们可以通过 fake ClientSet 来编写单元测试,本文将实践利用 fake ClientSet
1977 0
|
传感器 安全 编译器
【C语言】enum 关键字详解
`enum`关键字在C语言中提供了一种简洁而高效的方法来定义一组相关的常量。通过使用枚举,可以提高代码的可读性、可维护性,并减少错误的发生。在实际应用中,枚举广泛用于表示状态、命令、错误码等,为开发者提供了更清晰的代码结构和更方便的调试手段。通过合理使用枚举,可以编写出更高质量、更易维护的C语言程序。
752 2
|
Kubernetes 监控 容器
Istio安装及Bookinfo环境部署
文章详细介绍了如何在Kubernetes集群上安装和配置Istio服务网格,并通过部署Bookinfo示例应用来演示Istio的核心功能,如流量管理、服务监控和故障注入等。
261 1
Istio安装及Bookinfo环境部署
|
前端开发 JavaScript API
前端Get请求能在body上传参吗
【10月更文挑战第11天】 在浏览器环境中,GET请求的body参数会被忽略,这是因为浏览器中的XHR和fetch实现限制了这一行为。而在Node.js服务端环境中,GET请求可以在body中传递参数,因为服务端请求库没有这样的限制。实际上,GET请求不带body是HTTP标准的一部分,但在某些场景下,为了遵循RESTful规范,可以考虑通过服务端转发或BFF模式来实现复杂的参数传递。
|
安全 测试技术 网络安全
免费的ip地址证书有吗,哪里申请
在网络安全日益重要的今天,SSL证书成为保护网站数据传输安全的关键工具。对于拥有公网IP地址的用户,申请免费IP地址SSL证书是提升网站安全性的经济有效方式。本文介绍了通过知名CA机构如JoySSL申请免费IP地址SSL证书的步骤和注意事项,帮助用户轻松获得并安装证书,确保网站数据的安全传输。
|
SQL Java 数据库连接
Hibernate 和 JPA 有什么区别?
【8月更文挑战第21天】
939 0
|
SQL 开发框架 .NET
深入解析Entity Framework Core中的自定义SQL查询与Raw SQL技巧:从基础到高级应用的全面指南,附带示例代码与最佳实践建议
【8月更文挑战第31天】本文详细介绍了如何在 Entity Framework Core (EF Core) 中使用自定义 SQL 查询与 Raw SQL。首先,通过创建基于 EF Core 的项目并配置数据库上下文,定义领域模型。然后,使用 `FromSqlRaw` 和 `FromSqlInterpolated` 方法执行自定义 SQL 查询。此外,还展示了如何使用 Raw SQL 进行数据更新和删除操作。最后,通过结合 LINQ 和 Raw SQL 构建动态 SQL 语句,处理复杂查询场景。本文提供了具体代码示例,帮助读者理解和应用这些技术,提升数据访问层的效率和灵活性。
797 0
|
消息中间件 缓存 Java
高性能架构设计
高性能架构设计
334 5
|
监控 网络协议 Linux
centos常见的命令
【5月更文挑战第8天】了解和掌握基本的CentOS命令对于服务器管理至关重要。本文介绍了19个常用命令,包括`ls`、`cd`、`mkdir`、`rm`、`grep`、`find`、`sudo`、`vi/vim`、`cp/mv`、`du/df`、`history`、`top/htop`、`ps`、`netstat/ss`、`yum/dnf`、`ssh`、`iptables`、`journalctl`、`crontab`和`systemctl`。每个命令都提到了常见问题、使用技巧和避免错误的方法,帮助用户更好地管理和维护CentOS系统。
509 0