2012年6月5日火曜日

[雑記] Hibernateでイライラしてみる。

かねてからの憧れ、高嶺の花、Hibernateをいまさらながら使ってみた。



Hibernate Toolsのインストール
既存DBからのリバースエンジニアリングによるDTO、マッピングファイルの生成ができるみたい。これを入れてみる。

Eclipse Marketplaceにて「JBoss Tools」で検索
->JBoss Tools (Indigo)を選択
->すごい量のツール類の一覧より、Hibernate Toolsのみ選択
ライセンスに同意してインストール。

必要なライブラリの追加
m2eclipseがインストールされている状態で、新規Maven Projectを適当に作成。
pom.xmlに以下を追加。
  • hibernate-c3p0:4.1.3.Final
  • mysql-connector-java:5.1.20
(あ、使用データベースはMySQLね。あと、このときはC3P0も使おうと思っていた。)
hibernate-c3p0を追加すると、必要なライブラリが芋づる式に引っ張られてくるが。。。なんか依存関係のあるライブラリが多すぎるな〜(気にならない?)。

そして、後に自動生成されるコードのためにapache common loggingも追加しておいたほうがいい。
ログのコード書き換えるならslf4jでもいいかもよ。

コードの生成と修正
アクセス対象のデータベース、テーブルはすでにインスト、作成済みの状態としよう。
参考サイトさんをガン見しながら下記の手順を実施。

  • とりいそぎDB接続用のコンフィグファイル *.cfg.xmlの作成
  • リバースエンジニアリングファイル *.reveng.xmlの作成
  • DTO、DAO、マッピングファイル *.hbm.xml、コンフィグファイル *.cfg.xmlの生成(リバースエンジニアリング)

リバエンすると、 <テーブル名>.java というDTOと、マッピングファイル <テーブル名>hbm.xml を生成してくれる。これはまあ便利。
参考サイトさんでは作られていないが、DAOも自動生成できそうなのでやってみる。
<テーブル名>Home.javaという名前でDAOが生成されますが、問題は、、、
そのままだと動きません。
はは。ひどい話や。
とりいそぎ生成されたfindById(String id)メソッドを使ってみましたが、実行するとエラーがでます。
乗り越える試練は実行時に出るエラー2つ。と、試練に見せかけたトラップ1つ。

トラップ
生成されたDAOのコード内でSessionFactoryの取得にJNDI Lookupが使われているので、buildSessionFactory()に書き換えたら非推奨(deprecated)などと言われる。

[解答例]
前述の試練とこれを調べていくうちに、ServiceRegistryかも?かも?と思ってしまいますが、調べてはいけません。時間を無駄にします。
だいたい、オフィシャルのドキュメントですらbuildSessionFactory()引数無しで使ってるのだから。

試練其の一
エラーメッセージ: No CurrentSessionContext configured!
(意訳)おい、おまえ、SessionContext設定してねぇだろうが。

[解答例]
cfg.xmlファイルの<session-factory>タグ内に下記のプロパティを追加
<property name="current_session_context_class">thread</property>

試練其の二
エラーメッセージ:get is not valid without active transaction
(意訳)アクティブなトランザクションじゃねぇのにgetとか使うんじゃねぇよ、このばか。

[解答例1]
findByIdメソッド内、get()を使う前にSessionオブジェクトのbeginTransaction()を呼ぶ。get()が終わったらclose()を呼んだ方がよいのかな。
ちなみに、get()の代わりにload()使っても同じエラーが出るなりよ。

[解答例2]
SessionFactoryからSessionを取得するメソッドを、getCurrentSession()でなく、openSession()に書き換える。

というわけで、生成したままでは動かないのが取っつきづらいし、情報収集がめんどくさすぎて使う気が萎えますな。
あと、マッピングファイルを書くということはDAOのなかでRecordSetからDTOへの詰め替えコードを書くのと手間的に変わらんのではないか?管理するファイルが増えるだけ。私の不勉強の故かもしらんが、利点がよう分からん。xmlレスのS2Daoとかのほうがよさそうに見えるな〜。
ここからさらにSessionの管理、ThreadLocalとか勉強する必要があるみたいだし、あいかわらずtry catch地獄のようだし。。。

そんな訳で、違うやつも試してみよう。

[参考サイト]
Hibernate Tools インストール手順 - TATSUNET
第1章 チュートリアル (JBossサイト)

0 件のコメント: