关于懒加载的问题:
下面先是我写的相关的代码(最后面是问题):
Mapper映射文件:
数据库表:
Pojo类:
然后问题:
当SqlMapConfig.xml配置文件中的配置如下所示时:
测试:
结果:
在上述的查询结果中,只执行了一句select * from orders;,没有执行select * from user where id=#{arbitrary};说明即使aggressiveLazyLoading 设置为true,也会有懒加载。
之前我一直认为,看来我的理解还是不太对。
于是我又查阅了Mybatis官方文档:
总算搞清楚了QAQ:
在仔细阅读了mybatis的官方文档后,发现之前对于aggressiveLazyLoading的理解不太全面,
关键就是画红线的部分,下面还是使用前面的例子说明.
”upon a call to any of the lazy properties”这句话是一个在aggressiveLazzyLoading=true情况下会进行外部嵌套查询的一个条件.意思就是当aggressiveLazzyLoading=true时,只有当测试中调用pojo对象里的某个属性的时候才会执行外部嵌套查询,查询出整个这一条元组,在举的例子中,某个属性可以是任何一个属性,比如OrdersExtra中从Orders中继承的user_id属性,不一定非得是user属性
OrdersExtra类:
Orders类:
User类:
而当aggressiveLazzyLoading=false时,只有当测试中用到OrdersExtra中的user属性时,才会执行外部嵌套查询
并且官方文档中也明确指出了”each property on demand” ,说明每一个属性只有在被需要时才会被加载
下面对于上述我个人对于官方文档的理解进行了测试,测试如下:
例子还是用的之前的例子,只是修改了测试类中的内容
测试1:aggressiveLazyLoading=true时
测试代码1.1:
结果1.1:
结论1.1:当aggressiveLazyLoading=true,只要测试代码中用到了外嵌套查询中的某个‘任意’属性,外部嵌套查询就会被执行一次
测试二: aggressiveLazyLoading=false时
测试代码2.1:
结果2.1:
结论2.1:在aggressiveLazyLoading=false时,虽然测试代码中用到了某个任意属性,但它不是外部嵌套查询查出的user属性,所以不会进行外部嵌套查询
测试代码2.2:
测试结果2.2:
结论2.2: 还是在aggressiveLazyLoading=false时,上述测试代码中用到了user属性,所以进行了一次外部嵌套查询.刚好与前面对于官方文档中的理解一致.