延迟加载

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

而要启动延迟加载功能,除了 fetchType 外,还需要设置两个相关的全局配置属性:lazyLoadingEnabled aggressiveLazyLoading只有将 lazyLoadingEnabled 设为 true,并将 aggressiveLazyLoading 设为 false 时才能启用延迟加载功能。

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

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

Last updated