chofutaroメモ

ソフトウェアエンジニアによるソフトウェアエンジニアのためのメモ書き

eclipseでHibernateを使ってみました

O/Rマッピングの王道と思われるHibernateを使ってみました。

セットアップ

MySQLをセットアップする

私の開発環境にはMySQLが無かったため、ローカルPCにMySQL5をインストールしました。インストールは、MySQL初心者入門講座を参考にさせていただきました。結果から言うと、このページに書かれてあるとおりセットアップして問題ありませんでした。

  • データベースのタイプ : Multifunctional Database
  • Decision Support(DSS)/OLAP
  • Manual Selected Default Character Set /Collation : データベースの文字セットはShift-JIS

サンプルプログラム用のユーザを登録する際、チュートリアルに書いてある通りにユーザを作成しようとしてもエラーでダメでした。

ERROR 1133 (42000): Can't find any matching row inthe user table

どうやらWindowsではパスワードを設定してgrantしなければならないようで、

grant all privileges on hibernatetutorial hibernate@localhost identified by 'hibernate';

とすれば成功しました。

Hibernate tutorial with Eclipseに従ってサンプルを実行

ほとんどチュートリアルどおりで良いのですが、私の環境では3点ほど問題がありましたので列挙しておきます。

hibernate.cfg.xmlの修整

eclipseにはHibernateのプラグインを入れてあるので、hibernate.cfg.xmlは自動で作成されます。ただ、自動で作成されたhibernate.cfg.xmlhibernate.connection.driver_classがcom.mysql.jdbc.Driverでは無かったので、念のため手で修整しておきました。

加えて自動ではcurrent_session_context_class=threadが作成されないようなので、これは直接入力しました。

slf4jでエラーが発生

配布されていたHibernate Core 3.6.6.Final Releaseにはslf4j-api-1.6.1.jarが含まれているのですがこれでは''ダメ''で、slf4jを別途ダウンロードしてその中に含まれているslf4j-api-1.5.2.jarを使いました。

SessionFactoryの生成でなぞのエラー

サンプルプログラムのSessionFactoryUtilクラスの中のConfiguration().configure().buildSessionFactory()を呼び出すところで、

Initial SessionFactory creation failed.java.lang.NoClassDefFoundError: javax/persistence/EntityListeners

とエラーになりました。
原因はわからないのですが、参照ライブラリーにHibernate配布ファイルにあるhibernate-jpa-2.0-api-1.0.0.Final.jarを加えたら解決しました。

所感

オブジェクト指向DBMSという言葉が出始めた頃から、RDBMSの取り扱いを特別扱いしなくて良い方法はないものか考えていました。所謂インピーダンス・ミスマッチという問題です。JavaだけでなくC#でも今主流のプログラミング言語でデータベースを扱う場合、O/Rマッピングが必要になります。一手間必要ということです。

小さなプログラムでデータベースを使う場合、直接SQLを駆使してJDBC経由でデータベースを使えばいいのでしょうが、仕事で開発するシステムの場合そう簡単ではないことが多いのではないでしょうか。テーブル数やカラムが多いため、データベースチームとかDAOチームというデータベースを扱う専門の開発要員を配置することが多いと思われます。

今回使用してみたHibernateO/Rマッピングを簡単にするツールであることは感じ取れました。RDBMSのことが判っていなければならないことに変わりはないのですが、面倒な作業のうちかなりの部分をHibernateがやってくれます。Java Bean、Java Beanとテーブルのマッピングを自分で作成する必要はありますが、コードを自動生成*1する仕組みを併用すればかなり簡単にO/Rマッピングができそうです。

*1:例えばComponentAA/Adjuster