Hibernate ORマッピング

おはようございます。今日も蒸し暑いですね。週末はカゼのためほとんど家で寝ていました。TV見てもつまらないのでまた仕事をしてしまいました。たまにはゆっくり休んだほうがいいんでしょうけど、仕事も趣味もまざっちゃってますね。

 Hibernateがじょじょにわかってきました。HibernateJavaのオブジェクトと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の設計を専門の人に任せることができます。つまりシステムをモジュール化するための技術ですね。しかしそうすることによってより大規模なシステムが開発できるようになるというメリットもあります。

 ここ最近新しいソフトウェア技術はモジュール化するための技術ばかりです。StrutsTapestryはプレゼンテーション層のモジュール化で、SpringなどのDIコンテナも設定変更部分の分離です。

 これらの行き着く先はモジュール同士が動的に組み合わさってひとつの仕事をするシステムなのでしょう。Hibernateもどんどん賢くなってそのうちDBを見ただけで自動的にクラスを生成できるようになるかもしれませんね。

ランキングに一票お願いします!