おはようございます。今日も蒸し暑いですね。週末はカゼのためほとんど家で寝ていました。TV見てもつまらないのでまた仕事をしてしまいました。たまにはゆっくり休んだほうがいいんでしょうけど、仕事も趣味もまざっちゃってますね。
Hibernateがじょじょにわかってきました。HibernateはJavaのオブジェクトとRDBのデータをマッピングするためのミドルウェアです。
Hibernateを使うためにはまずDBにテーブルを作成して、Javaアプリケーション側では3つのファイルを作成します。
1 Hibernateコンフィグファイル
後述のマッピングファイルのありかやサーバー設定のためのファイル。hibernate.cfg.xmlってファイル名になってました。
(例)
<?xml version='1.0' ?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
< hibernate-configuration>
< session-factory>
< property name="connection.url">
jdbc:postgresql://ホスト名 /データベース名
</property>
< property name="connection.username">ユーザ名 </property>
< property name="connection.password">パスワード</property>
< property name="connection.driver_class">org.postgresql.Driver</property>
< property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
< property name="show_sql">true</property>
< mapping resource="example.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2 Hibernate ORマッピングファイル
JavaクラスとRDBのテーブルをマッピングさせるファイル。(クラス名).hbm.xmlというファイル名になる。
(例)
<?xml version="1.0" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
< hibernate-mapping>
< class name="Memo" table="MEMO">
< id name="memoid" column="MEMOID" type="int" >
< generator class="assigned" />
< /id >
< property name="message" type="string" column="MESSAGE" />
< /class >
< /hibernate-mapping >
この例ではMemoクラスのメンバー変数idをRDBのMEMOテーブルのMEMOIDというカラムにマッピングしています。同様にMemoクラスのメンバーmessageをMESSAGEカラムにマッピングします。Hibernateでは< id >で設定されたメンバーは特別でRDBレコードのプライマリーキーに対応します。
ORマッピングで難しいのはオブジェクト指向テクニックである継承やポリモフィズムをRDBにどのようにマッピングするかです。この回答はやや込み入っていますのでまたの機会に書きたいと思います。
ORマッピングは何でも解決する銀の銃弾ではありません。むしろエンジニアにとって難しい技術だと思います。なぜならばORマッピングはRDBとオブジェクト指向の両方がわかっていないと設計できないからです。Javaのクラス構造から最適なテーブル設計をしなければいけません。
では何がうれしいかというとアプリケーションを書くエンジニアからはDBを意識しなくてもよくなるからです。今まではアプリケーションエンジニアがSQLをプログラムの中に埋め込んでいましたが、ORマッピングを使うことによってDBへのアクセス部分を分離することができるようになったことです。
結局この技術って職種を細分化するための技術です。HibernateによってパーシステントクラスとDBの設計を専門の人に任せることができます。つまりシステムをモジュール化するための技術ですね。しかしそうすることによってより大規模なシステムが開発できるようになるというメリットもあります。
ここ最近新しいソフトウェア技術はモジュール化するための技術ばかりです。StrutsやTapestryはプレゼンテーション層のモジュール化で、SpringなどのDIコンテナも設定変更部分の分離です。
これらの行き着く先はモジュール同士が動的に組み合わさってひとつの仕事をするシステムなのでしょう。Hibernateもどんどん賢くなってそのうちDBを見ただけで自動的にクラスを生成できるようになるかもしれませんね。