chapter-5--延迟加载(lazyLoadingEnabled、aggressiveLazyLoading、fetchType)

chapter-5--延迟加载(lazyLoadingEnabled、aggressiveLazyLoading、fetchType),第1张

一、lazyLoadingEnabled和aggressiveLazyLoading

我们可以在<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属性的优先级是高于全局属性的,会覆盖它们。

你的注解不对,少了一个关联表的设置当然没有了,

在course那个注解下面写上@JoinTable(name = "......", catalog = "........", joinColumns = { @JoinColumn(name = "......", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = ".......", nullable = false, updatable = false) })这样才能够生成关联表啊!建议楼主好好看看hibernate annotation的使用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12085418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存