Result Maps collection already contains value for com.dxt.bx.reader.api.dao.UserMapper.BaseResultMap

今天我在搭建SSM框架环境时,配置都配好了,就等运行测试,谁知道一来就报错,并且这个错误折腾了我一下午,真的是血的教训:

BeanCreationException:Error creating bean with name 'sessionFactory' defined in file ...

我看到这个错误后,我就打开配置文件查看包含sessionFactory的配置,怎么看自己都觉得没有什么地方不对,百度了一下,都在说是配置的错误或者是jar包冲突或者缺少jar包,但我控制台没有显示jar包的问题,就排除了这种情况。

之后在控制台还发现了一个错误:

Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.dxt.bx.reader.api.dao.UserMapper.BaseResultMap

说是BaseResultMap已经存在,我就找到对应的UserMapper.xml点进去看,ctrl+f  搜索 BaseResultMap,发现真的还多了许多id=BaseResultMap,出现重复的情况,这是逆向工程生成的文件,为什么会出错呢?

原因有几下几点:

  • 逆向工程生成时,如果你没有删除原来的mapper.xml,新生成的mapper.xml并不是覆盖原来的,而是追加。所以删掉原来的文件重新生成一次就好
  • Mybatis Generator 生成代码重复使用的是1.3.2版本和elipse插件,eclipse 为3.7.2,在suppressAllComments设置为true时出现此现象,实体类和mapper.xml也会重复生成

   
   

造成第二点的原因

  • 因为oracle数据库用户权限高,你连接的那个用户可以查询到整个数据库用户的表,可以访问到别的用户的表,当其他用户中也存在相同的表名时,就会导入同样的字段。
  • mysql也存在同样的bug,虽然数据库不一样,但是root权限可以访问所有数据库,所以就会导致出现重复的BaseResultMap

解决方法:

  • 删掉多余的部分,因为比较有规律,删除多余的就行
  • 把suppressAllComments设置为false
  • oracle数据库可以这么这么做:

Table schema问题

下边是关于针对oracle数据库表生成代码的schema问题:

 

Schma即数据库模式,oracle中一个用户对应一个schema,可以理解为用户就是schema。

当Oralce数据库存在多个schema可以访问相同的表名时,使用mybatis生成该表的mapper.xml将会出现mapper.xml内容重复的问题,结果导致mybatis解析错误。

解决方法:在table中填写schema,如下:

XXXX即为一个schema的名称,生成后将mapper.xml的schema前缀批量去掉,如果不去掉当oracle用户变更了sql语句将查询失败。

快捷操作方式:mapper.xml文件中批量替换:“from XXXX.”为空

 

Oracle查询对象的schema可从dba_objects中查询,如下:

select * from dba_objects

 

你可能感兴趣的:(java异常)