# 延迟加载

在 **association** 和 **collection** 中存在属性 **fetchType**，当将该属性设置为 lazy 即可使用延迟加载功能，从而将嵌套查询推迟到获取指定字段时才执行。

而要启动延迟加载功能，除了 fetchType 外，还需要设置两个相关的全局配置属性：<mark style="color:blue;">**lazyLoadingEnabled**</mark> 和 <mark style="color:blue;">**aggressiveLazyLoading**</mark>。<mark style="color:orange;">**只有将 lazyLoadingEnabled 设为 true，并将 aggressiveLazyLoading 设为 false 时才能启用延迟加载功能。**</mark>

{% hint style="info" %}
在 MyBatis 的全局配置中，有一个参数为 **aggressiveLazyLoading**。这个参数的含义是，当该参数设置为 true 时，对任意延迟属性的调用会使带有延迟加载属性的对象完整加载，反之，每种属性都将按需加载。
{% endhint %}

{% hint style="warning" %}
MyBatis 延迟加载是通过**动态代理**实现的，当调用配置为延迟加载的属性方法时，动态代理的操作会被触发，这些额外的操作就是通过 MyBatis 的 SqlSession 去执行嵌套 SQL 的。由于在和某些框架集成时，SqlSession 的生命周期交给了框架来管理，因此当对象超出 SqlSession 生命周期调用时，会由于链接关闭等问题而抛出异常。<mark style="color:orange;">**在和 Spring 集成时，要确保只能在 Service 层调用延迟加载的属性。当结果从 Service 层返回至 Controller 层时，如果获取延迟加载的属性值，会因为 SqlSession 已经关闭而抛出异常。**</mark>
{% endhint %}
