mybatis绑定多个mapper,@ResultMap 报错: Mapped Statements collection already contains value for xxx
mybatis绑定多个mapper,@ResultMap 报错: Mapped Statements collection already contains value for xxx
最近遇到一个奇葩的问题,主要是之前没遇到过。
检查了 id,没有重复的,检查了parameterMap等常规错误,没发现问题。
大概是这样的,项目中用了 mybatis的自动生成代码插件,
于是生成了类似 Activity.java、ActivityMapper.java、ActivityMapper.xml 的这三种文件。
为了方便替换生成的文件,自动生成的ActivityMapper.xml就尽量不改动,我们自己写的sql就放在命名为 ActivityExtMapper.xml中, 当然xml里面的namespace要和ActivitiMapper.xml保持一致。 于是,一个ActivityMapper.java就对应了两个 xml文件。xxx.xml.auto.generate 目录放的自动生成的xml, xxx.xml就是自己写的xml,如图:
于是,在配置文件中,扫描xml的路径为:
-
突然,问题出现了!
因为项目是多人写的,所以我们的sql有用注解的,有用xml的。比如,其中有个sql就用的注解,如图:我觉得这个问题奇葩的地方是,这个sql最近没改过,而且之前一直运行好好的,突然昨天在我的电脑和另外个同事的电脑上运行的时候,就会报错:Mapped Statements collection already contains value for xxx.getProductInvestOrders; 但是在其他同事的电脑中运行又没问题!
后来才发现,是因为有多个mapper.xml, 执行sql时是随机找了一个xml来绑定ResultMap,可能会绑定到自动生成的xxMapper.xml中的BaseResultMap。而这个sql的ResultMap的ID是自己写的定义在 xxxExtMapper.xml中的,所以执行sql的时候,就会报错,意思是已经为这个sql绑定了一个ResultMap了,不要重复绑定。
问题找到了,就是要指定加载xml的顺序。如图:然后就没问题了。总结下来,还是对mybatis的掌握不够深入。注解用得也比较少。
记个笔记,方便以后看。