はまりメモ

mybatisを適当に触って気になったことをメモります。ちなみに私、iBATISも録に触ったことがない素人です。ひとまずチュートリアルを参考に、SQL Map XML FilesとMapper interfaceを同じ絶対パス名で作成して見ました。こんな感じ。

/classses/
 /firststep
  /FirstStepMapperDef.class
  /FirstStepMapperDef.xml

そうしたところ、こんなんエラーを吐きやがりました。。。

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in firststep/FirstStepMapperDef.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for firststep.FirstStepMapperDef.find
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:32)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:15)
at firststep.HelloIBATIS.main(HelloIBATIS.java:17)
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for firststep.FirstStepMapperDef.find
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:68)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:52)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:29)
... 2 more
Caused by: java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for firststep.FirstStepMapperDef.find
at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:71)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:51)
at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.loadXmlResource(MapperAnnotationBuilder.java:111)
at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse(MapperAnnotationBuilder.java:89)
at org.apache.ibatis.binding.MapperRegistry.addMapper(MapperRegistry.java:43)
at org.apache.ibatis.session.Configuration.addMapper(Configuration.java:377)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.bindMapperForNamespace(XMLMapperBuilder.java:246)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:52)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement(XMLConfigBuilder.java:244)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:66)
... 4 more
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for firststep.FirstStepMapperDef.find
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:451)
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:426)
at org.apache.ibatis.session.Configuration.addMappedStatement(Configuration.java:339)
at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:215)
at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:66)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:204)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:69)
... 13 more

これどうもiBATIS3時代からある不具合らしくて、以下のJIRRAには登録されているんだけどmyBATISには引き継がれていないっぽい。(直したって書いてあるからなぁ…)

https://issues.apache.org/jira/browse/IBATIS-625

しょうがないので、当面はXMLJavaファイル名は拡張子を除いても同じ名前にならないように、いちいち気にしてやらないといけませんね。面倒ですね。個人的にはMapperとXMLの組み合わせ機能はいろいろ融通が利くのでよいと思うんだけど、そもそもXMLJavaを二重定義することになるのが激しく気になっています。誰かEclipse Plugin作らないかな。