mybatis3.2.8中,association关联测这块本人有个疑问?是bug吗?还是mybits就这样?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis3.2.8中,association关联测这块本人有个疑问?是bug吗?还是mybits就这样?相关的知识,希望对你有一定的参考价值。
本人之前没用过mybatis,这两天刚用,下载的3.2.8最新的版本,做了一个测试:
下面摘要一些测试的代码:
-------------------------------------------Blog.java---------------------------------------------------------------------
...
private Integer id;
private String title;
private Author author;
...
-------------------------------------------Author.java---------------------------------------------------------------------
...
private Integer id;
private String userName;
private String passWord;
private String email;
private String bio;
...
----------------------------------------Blog.xml---------------------------------------------------------------------------------
<mapper namespace="org.wzd.mapper.BlogMapper">
<resultMap type="Blog" id="detailedBlogResultMap">
<association property="author" column="author_id" javaType="Author" select="selectAuthor" fetchType="lazy"/>
</resultMap>
<select id="selectBlogDetails" resultMap="detailedBlogResultMap">
select * from Blog B where B.id = #id
</select>
<select id="selectAuthor" resultType="Author">
select * from Author A where A.id = #id
</select>
</mapper>
-----------------------------------------------------测试类---------------------------------------------------------
测试类:
Blog b=blogMapper.selectBlogDetails(1); //很好,发现只进行了对Blog的查询,说明fetchType=lazy有用
继续测试:
b.hashCode();//发现竟然对Author也进行了查询?随便只要用到Blog,就触发关联查询?!不对啊,难道不是应该当使用到了Blog类中Author时,才会触发关联查询吗?
---------------------------------------------------------问题解决了-------------------------------------------------
希望再遇到此问题的朋友们不要再向我这样走弯路了,时间真的很宝贵的,特此把解决的钥匙给大家说一下:
光开启这个lazyLoadingEnabled没用,因为它后面还有一个坑B的属性:aggressiveLazyLoading,记住一定得关闭,因为丫就存在根本就是让你无法使用延迟加载。日它!!!!!!!!!!!!!!!!!!
否则的话,如果其他内容相同,author不同,难道就要hash成一样的结果吗?追问
当然,我上面b.hashCode()只是测试中的某一条而已,你不只能纠结于此方法。
我测试了我知道的所有方式,例如:b.getTitle(); b.getId();b.toString();等等,难道这些也都影响到了b.author???
千万不要告诉我对 b对象的任何使用都会影响b.author,那样的话,我想你已经跑题了~
不会啊,只有b.hashCode()会。
如果你把b.getTitle();替换了上面的hashCode,然后重新debug,就会发现没加载了。
如果真的getTitle都会,应该就是懒加载策略的问题了,你看一下你的其他配置文件,是不是懒加载机制被全局关闭了。我以前用的时候lazy策略是一直有效的啊。
经过不懈的努力,终于解决问题了.‘
b这个对象创建后,就是不能在使用了。
mybatis就是这样设置的。
因为mybatis是通过使用过CGLIB代理额,来创建具有延迟加载能力的对象的。
呵呵,花了我这么多天就为了了解这么点本质,哈哈
我没你研究这么深入。。我当时使用的时候就是正常的。佩服。
追问哎,没办法啊,我遇到解不开的疙瘩心理就惦记着寝食难安。
其实我这样并不好,费劲巴拉的在一个障碍上浪费太多的时间,反而错过了后面的更多精彩。一直劝自己,不妨先绕过去欣赏其它美景,待眼界更开阔后,也许前面那处的遗憾自然而然的能解开了~
可惜我性格所致,知道这些道理,却总是放不下啊,哎
MyBatis(10)使用association进行分步查询
(1)接口中编写方法
public Emp getEmpByStep(Integer id);
public Dept getDeptById(Integer id);
(2)Mapper文件
1 <!-- 使用association进行分步查询 --> 2 <resultMap type="com.eu.bean.Emp" id="MyStep"> 3 <id column="id" property="id"/> 4 <result column="last_name" property="lastName"/> 5 <result column="gender" property="geder"/> 6 <result column="email" property="email"/> 7 <association property="dept" 8 select="com.eu.dao.DeptDao.getDeptById" 9 column="d_id"> 10 </association> 11 </resultMap> 12 <select id="getEmpByStep" resultMap="MyStep"> 13 select * from emp where id = #{id} 14 </select>
以上是关于mybatis3.2.8中,association关联测这块本人有个疑问?是bug吗?还是mybits就这样?的主要内容,如果未能解决你的问题,请参考以下文章