[Java]
MyBatis vs Hibernate
どうやらO/R Mapperの戦いではHibernateが自滅したようだ
以下、ソフトウェア開発者による公式のHibernateに対する評価
- Hibernateはどのようにして私のキャリアを破滅寸前にしたか from ソフトハウス Open Tangerine
- "HibernateとActiveRecordは同じOR Mapperでも設計思想が大きく違う(詳しくはPofEAAを読むと良い)"
- 我々はいかにして技術選択を間違えたのか? 2016 from サイボウス
- どう失敗だったのか?
- JPAに準拠することを目指しながらもEntityのプロパティ変更を自動的にDatabaseに反映する機能は我々は必要としていなかった
- パフォーマンスの劣化、運用障害の原因になってしまった
- Hibernateに問題があるケースの調査が難しく、コストが辛い
- どう失敗だったのか?
ちなみに管理人は、Ruby on Rails + ActiveRecord/ActiveResource, Hibernate, MyBatis全部使ったことがある。
MyBatisのエラー別対応
Mapped Statements collection does not contain value for クラス名
これは単にMavenとMyBatisの仕様の問題。
Mapped Statements collection already contains value for クラス名
上とは逆の話
MyBatisは実行時にクラスパス上にあるすべてのXMLファイル(Mapper)を見ようとする。eclipseなどのIDEを使っている場合、生成された余計なクラスファイルを見に行った結果、2重にXMLを読み込んでいることがある。
XMLファイルの指定は様々だが、MyBatis+Springならば
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="/WEB-INF/config/mybatis-config.xml" /> <property name="mapperLocations" value="/WEB-INF/classes/your/package/name/*.xml" /> </bean>
Mapper用のXMLファイルがMavenのsrc/main/resources以下に配置されていたものとする。その場合、Mavenビルドのシーケンス上 compile フェイズで target/classes 以下にクラスファイルとXMLファイルが吐かれる。同様にして、{生成されたアプリ名}/WEB-INF/classes/your/package/name/*.xml上にもマッパーファイルが吐きだされる。eclipseのJettyプラグインなどでこれを実行すると、本来は後者のXMLファイルのみを読み込むことを想定しているのだが、前者のXMLも後から読み込まれるのでこのエラーが出る。どちらかというとeclipseが余計なおせっかいをしている印象だ。とりあえずclassesディレクトリを削除してアプリを動かすと問題なく動くようになる。