1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。3、比方User类有两个属性,name跟address,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户的所有资料都加载到对象中,于是有了这两种加载模式。
我们来用一个典型的案例作对比
一个用户有编号 用户名 ......和角色,正常情况下用户登录后不需要查询角色,但是现在我们想要查询到角色 一个用户可以有多个角色,员工和角色是两张表 ,一般我们在项目配置中都是配置延迟加载(懒加载)
<configuration>
<!-- 启用延迟加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true" />
<!--<!–设置为false之后表示在访问many方的属性(非关联的对象的属性)的时候不要触发延迟加载–>-->
<setting name="aggressiveLazyLoading" value="false" />
<!--<!–当访问Object中的clone方法的时候触发延迟加载–>-->
<setting name="lazyLoadTriggerMethods" value="clone" />
</settings>
</configuration>
我们在项目中有查询角色的sql(根据员工编号查询角色)
<collection property="roles" ofType="Role"
select="com.jd.wms.mapper.RoleMapper.selectRolesByEmployeeId"
column="id">
</collection>
调用RoleMapper里的方法查询角色
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>
查询出的结果是
我们明明写了查询语句但是却没有查询到原因就是我们启用了延迟加载
现在我们的需求是需要把角色也显示出来怎么破?
这时我们就需要使用fetchType.eager(急加载)
添加一个属性fetchType="eager"
<collection property="roles" ofType="Role"
select="com.jd.wms.mapper.RoleMapper.selectRolesByEmployeeId"
column="id" fetchType="eager">
</collection>
这时我们发送请求得到的结果就是