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,记住一定得关闭,因为丫就存在根本就是让你无法使用延迟加载。日它!!!!!!!!!!!!!!!!!!

参考技术A b.hashCode()会对b对象的所有内容进行hash算法计算。所以会加载b的属性author。
否则的话,如果其他内容相同,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就这样?的主要内容,如果未能解决你的问题,请参考以下文章

mybatis示例集合

SpringMVC + MyBatis整合

Mybatis foreach迭代复杂对象参数内的整数列表

基于SSM的租赁管理系统0.2_20161225

spring使用context:property-placeholder载不进属性问题

Mybatis中collection和association的使用区别