chapter-5--延迟加载(lazyLoadingEnabl
一、lazyLoadingEnabled和aggressiveLazyLoading
mybatis的基础配置文件我们可以在<settings>元素中配置延迟加载如下示例:
<setting name="lazyLoadingEnabled" value="true" /> <!-- 默认为false -->
<setting name="aggressiveLazyLoading" value="true" /> <!-- 3.4.1(包含)之前为true,之后为false -->
lazyLoadingEnabled和aggressiveLazyLoading常常一起使用,他们一起使用有以下两种不同的起作用的情况:
1、 lazyLoadingEnabled: true/false aggressiveLazyLoading: true
这种情况下,会依层次分别延迟加载,但是不管POJO这个属性是否被调用都会加载进来,举个例子:
映射文件:
<mapper namespace="com.learn.mybatis.chapter05.cascading.EmployeeMapper">
<resultMap type="com.learn.mybatis.chapter05.cascading.Employee" id="employee">
<id column="id" property="id" />
<result column="real_name" property="realName" />
<result column="sex" property="sex"
typeHandler="com.learn.mybatis.chapter04.typehandler.SexEnumTypeHandler" />
<result column="birthday" property="birthday" />
<result column="mobile" property="mobile" />
<result column="email" property="email" />
<result column="position" property="position" />
<result column="note" property="note" />
<association property="workCard" column="id"
select="com.learn.mybatis.chapter05.cascading.WorkCardMapper.getWorkCardByEmpId" />
<collection property="employeeTasks" column="id"
select="com.learn.mybatis.chapter05.cascading.EmployeeTaskMapper.getEmployeeTaskByEmpId" />
<discriminator javaType="long" column="sex">
<case value="0" resultMap="MaleHealthFormMapper" />
<case value="1" resultMap="femaleHealthFormMapper" />
</discriminator>
</resultMap>
<resultMap type="com.learn.mybatis.chapter05.cascading.FemaleEmployee"
id="femaleHealthFormMapper" extends="employee">
<association property="femaleHealthForm" column="id"
select="com.learn.mybatis.chapter05.cascading.FemaleHealthFormMapper.getMaleHealthForm" />
</resultMap>
<resultMap type="com.learn.mybatis.chapter05.cascading.MaleEmployee"
id="MaleHealthFormMapper" extends="employee">
<association property="maleHealthForm" column="id"
select="com.learn.mybatis.chapter05.cascading.MaleHealthFormMapper.getMaleHealthForm" />
</resultMap>
从映射文件中我们可以提炼出如下的层次关系:
discriminator元素中指定的resultMap中的association级联关系会同实体一起首先被加载进来,上述例子中的Employee员工实体和实体中的体检表级联属性会首先加载进来,然后是雇员任务和工卡(这两个属性都位于id为employee的resultMap中的association元素中所以它们是同一层),最后是任务(任务与雇员任务存在直接的级联而与员工实体存在间接的级联,所以它和雇员任务及工卡不是一层)被加载进来。
2、lazyLoadingEnabled: true aggressiveLazyLoading: false
这种情况下,只有实体主体被加载进来,其它的级联属性只有当被调用时才会被加载,这里也没有分层次加载,
一句话总结就是用到的时候才会加载。
二、fetchType
上述的设置都是针对全局的,在某些情况下不够灵活。比如负责员工任务信息分配的领导只关心雇员实体和雇员任务的级联关系,其它的如工卡与雇员实体的级联关系则不需要关注,但是工卡和雇员任务恰恰和雇员实体都是同一层的直接级联关系。这时候就需要用fetchType单独为某个级联关系设置是否延迟加载。
需要特别注意的时fetchType属性只能在association和collection中进行设置,discriminator没有这个属性。
fetchType的取值有两个:
eager: 获得当前的POJO后立即加载对应的数据。
lazy:获得当前的POJO后延迟加载对应的数据。
说句废话,fetchType属性的优先级是高于全局属性的,会覆盖它们。