トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

MyBatis

[Java]

  MyBatis vs Hibernate

どうやらO/R Mapperの戦いではHibernateが自滅したようだ

以下、ソフトウェア開発者による公式のHibernateに対する評価

  • 我々はいかにして技術選択を間違えたのか? 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ディレクトリを削除してアプリを動かすと問題なく動くようになる。

お名前: コメント: