小白的IT之路的gravatar头像
小白的IT之路 2019-03-11 17:00:56
Mybatis出现Mapped Statements collection already contains value for XXX 错误(相对较全)

在我们开发过程中有时会遇到这个问题,大体意思是mapper映射集合的值已存在,那么在此记录下我遇到此问题的寻找过程,小白一枚,不喜勿喷,有大佬看出问题请多指教......

 

在此过程中我也查询了许多相关博客,各种百度贴吧,然后总结了我自己认为可能的一些错误。

先从做简单的开始吧:

 

1、Mapper中存在了重复的id(同一个Mapper.xml 文件中重复出现了两个id 为XXX的方法)

那么就需要好好检查程序报错的地方,调用对应的mapper文件里的方法id了,看看是否id命名一样

2、有可能是parameterType和resultType,参数类型错误

仔细检查方法中的parameterType和resultType,查看相应的参数类型是否有错,或者有空的忘记写了。

3、有可能你的sqlSessionFactory中配置了多个xml的地址。

这时就需要仔细查看你的配置文件,是否将xml地址配重复了,将多余的删除掉。

4、若你项目中使用了2个xml文件去对应了一个.java文件,引用了同一个方法,而方法id相同就可能会出 现,比如:userDao.xml,userExlDao.xml,有多个mapper.xml, 执行sql时是随机找了一个xml来绑定ResultMap,就可能会出现此问题,那么这个时候就需要指定xml文件的加载顺序了。(这种情况比较少)

 

5、多数据源的情况下,同一mapper文件被扫描了多次,导致异常。

 

6、如果以上情况都排查过还无法解决,那么就需要手动更改id的命名了,保证同一命名空间下id唯一,在后台报错行查看是哪一个方法调用报错,更改id,这也是没办法的办法了。

 

7、还有一种情况,就是多线程并发访问时会出现此问题,几乎在同一秒内甚至同一毫秒内程序执行调用多次,扫描mapper文件调用方法时会出现,对此我也比较头大,因为对这个多线程访问不是很熟,虽然没有手动写多线程开启,但是Java程序默认就是多线程,所以会有并发访问。(这个方式是找来的,没有实践过,提供大家参考)

解决方式:mybaits初始化时加上sqlSesssionTemplate.getConfiguration().buildAllStatement。让Mybatis初始化时就编译sql语句。

 

以上就是我总结的可能的原因,尽可能的先排查然后清除tomcat的缓存,试着跑一边看看,我的项目属于最后一种情况,我只是把有问题的id改了一遍,并不确定问题是否解决,测试时并没有出现或者说再遇见,但有可能还会出现,大家可以研究研究。《小白爬坑记》

此文章属于原创


打赏
最近浏览
孤帆远影碧空尽 2022年1月14日
暂无贡献等级
sjshdzdm 2021年7月25日
暂无贡献等级
N次方2021 2021年7月20日
暂无贡献等级
jlonline  LV2 2021年7月15日
蓝图山 2021年6月1日
暂无贡献等级
gggjjj 2021年5月28日
暂无贡献等级
fjfzwufeng  LV1 2021年4月14日
254007472 2021年3月18日
暂无贡献等级
3217432437  LV2 2021年1月11日
xiaochaoya 2021年1月7日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友