MyBatis延迟加载触发条件是访问关联属性真实值,而非方法名:getter调用必触发;集合的size()、isEmpty()、遍历等操作均触发;aggressiveLazyLoading=false时toString等基础方法不触发,true时则全部触发;序列化过程(如Jackson)也会隐式触发。

MyBatis 延迟加载的触发不是靠“方法名”本身,而是看该方法是否会导致代理对象去读取关联属性的真实值。只要操作触及了被懒加载字段的内部数据,代理就会拦截并发起查询。
getter 方法调用必然触发
这是最常见也最明确的触发方式。当调用被配置为 fetchType="lazy" 的关联属性对应的 getter 时,MyBatis 会立即执行关联 SQL:
-
user.getProfile()(一对一) -
order.getItems()(一对多,返回 List) article.getAuthor()
集合类常用操作全部触发
对懒加载的 <collection> 字段(如 List<Order>),以下任意行为都会激活查询:
- 调用
size()—— 即使只是想知道有多少条 - 调用
isEmpty()、iterator()、stream() - 使用 for-each 循环遍历
- 调用
get(index)或contains(...)
对象基础方法在 aggressiveLazyLoading=true 时触发
这个行为取决于全局配置 aggressiveLazyLoading:
立即学习“Java免费学习笔记(深入)”;
- 若设为 false(推荐):调用
toString()、hashCode()、equals()、clone()不会触发懒加载 - 若设为 true:这些方法一调用,就会把当前对象所有未加载的懒加载字段全部查出来——失去按需意义,一般不建议
序列化过程隐式触发
将对象转成 JSON(如用 Jackson)、或进行远程传输(如 Dubbo 序列化)时,框架会反射访问所有可读属性。此时哪怕没写 .getXXX(),只要字段是懒加载代理,就会被强制加载:
ObjectMapper.writeValueAsString(user)- Spring MVC 返回 JSON 响应体时自动触发
- RPC 调用中对象出参序列化阶段


















