aggressiveLazyLoading=false时仅访问具体getter才加载对应关联属性,true时调用toString等任意方法即加载全部延迟属性;推荐设为false并清空lazyLoadTriggerMethods以避免意外查询。

aggressiveLazyLoading 控制的是“访问关联对象的任意方法”是否立即触发全部延迟属性加载,而不是只加载被调用的那个属性。
aggressiveLazyLoading = true 时的行为
只要调用代理对象上的任意一个方法(包括 toString()、hashCode()、equals()、clone() 等),MyBatis 就会把该对象所有配置为延迟加载的关联属性一次性查出来。
- 比如 User 对象关联了 orders(一对多)和 role(一对一),两者都设为 lazy
- 执行
user.toString()就会同时触发selectOrdersByUserId和selectRoleById - 即使你只打算打印用户姓名,也会额外查出订单和角色数据
aggressiveLazyLoading = false 时的行为
这是推荐设置。只有真正访问某个具体延迟属性的 getter 方法时,才加载对应那一个关联对象。
- 调用
user.getOrders()→ 只查 orders - 调用
user.getRole()→ 只查 role - 调用
user.getName()或user.toString()(若未配置lazyLoadTriggerMethods)→ 不触发任何延迟查询
它和 lazyLoadTriggerMethods 的关系
aggressiveLazyLoading 决定“加载范围”,而 lazyLoadTriggerMethods 决定“哪些方法调用会触发加载”。两者配合使用:
立即学习“Java免费学习笔记(深入)”;
- 当
aggressiveLazyLoading="false"时,lazyLoadTriggerMethods列出的方法(默认是equals,clone,hashCode,toString)调用仍可能触发加载 —— 所以常建议清空该值:value="" - 当
aggressiveLazyLoading="true"时,哪怕只调用toString(),也会把所有延迟字段全查一遍,此时lazyLoadTriggerMethods的配置就意义不大了
为什么推荐设为 false
避免“意外加载”:调试时打印对象、日志框架调用 toString()、单元测试中比较对象等场景,都可能在无意识中拉取大量无关数据,导致 N+1 查询放大或性能抖动。


















