対決! O/Rマッパー vs. オブジェクト指向DB

第1回 Javaのオブジェクト永続化に何を選ぶ?

ネクストデザイン
村山 徹
2005/12/7

永続化をスマートに解決する

 O/Rマッピングに費やされる開発工数は、全体の40%近くを占めるという報告があります。開発経験のある方であれば、この数字は決して大きいとは思われないでしょう。永続化の問題をいかに解決するかは、システム開発の成否を決める重要なポイントです。本稿では、現時点で最もスマートな解決方法と思われる、O/Rマッピングツール「Hibernate」を使用する方法と、オブジェクト指向データベース「Caché」を使用する方法の2つを比較します。

O/Rマッピングツールとは

 これは文字どおりO/Rマッピングを実現するためのツールやフレームワークを指します。現在、オープンソース・ソフトのものや商用の製品などが存在します。例えば、

  • Torque
  • Cayenne
  • JDO仕様とその実装
  • O/Rマッピングを含むフレームワークとしてのJ2EE

などがあります。その中で、最も期待されているのはJ2EE CMP(Container Managed Persistence) EntityBeanではないかと思います。しかし、その複雑さや速度性能などには課題もあります。その意味で、スタンダードと呼べるものは、まだないといえるでしょう。

Hibernateについて

 今回取り上げるHibernateは、実用性や実績で評価が高いオープンソース(LGPLライセンス)のO/Rマッピングツールです。Hibernateは、J2EEの次期バージョンであるJava EE 5の仕様にも大きな影響を与えています。そのため、Hibernateに関するスキルは、そのままJava EE 5でも生かせるといってもよいほどです。

 本稿では、Hibernate 2.1.6を使用しています(執筆時点の最新バージョンは3.1 beta2)。具体的な使用方法については次回に紹介しますが、その前に、Hibernateの使用方法の選択について、簡単に触れておきます。

 Hibernateでは、永続化するクラスの情報などを事前に定義しておく必要があります。そして、その定義方法は複数用意されています。

  1. XML設定ファイルを使う方法
  2. XDocletを使う方法
  3. アノテーションを使う方法

 2と3のアプローチは基本的に同じで、今後はアノテーションを使う方法が主流になるでしょう。

 本事例の開発時点では、1か2の選択でしたので、1の方法を使用しています。その理由は、2のXDocletを使う方法では、永続クラスのJavaソースコードに、(本来必要のない)ステートメント(例えば、「@hibernate.class table="REPORT_TABLE"」など)が追加されることで、ソースコードの可読性が低下するのではないかと思われたからです。

 しかし、1の方法にも、懸念される点があります。それは、XML設定ファイルのメンテナンス・コストです。簡単なオブジェクト・モデルであれば、それほど問題はないでしょう。しかし、実際のシステム開発となると、その煩雑さが問題になるかもしれません。そのため、1の方法であれば、XML定義ファイルと永続クラスのJavaソースコードを管理する仕組みや、2の方法であれば、可読性を低下させない工夫など、事前に検討する必要があるでしょう。ちなみに、本事例では、表形式の永続化属性リストから、XML設定ファイルとJavaソースコードを生成するツールを用意しています。Hibernateの詳細は公式ページをご覧ください。


オブジェクト指向データベースとは

 O/Rマッピングがインピーダンスミスマッチを解決する仕組みであるのに対して、もう1つの選択肢があります。それは、もともとインピーダンスミスマッチが発生しないオブジェクト指向データベース(以下OODBMS)を使って永続化することです。OODBMSでは、オブジェクトをそのままのモデルで保存し復元できます。つまり、表1に相当する部分が基本的に不要になります。この違いは、後述の「オブジェクト指向データベースとリレーショナル・データベースの違い」を参照してください。

 OODBMSは現在のところ、そのほとんどが商用の製品です。筆者が検索した限りでは、オープンソース(LGPLライセンス)のOODBMSはありませんでした。しかし、本事例の開発時点では入手できませんでしたが、(LGPLではなく)GPLライセンスの「db4o」があります。

Cachéについて

 本稿では、OODBMSとしてCachéを取り上げました。Cachéは商用の製品で、正確には多次元データベースという製品です。RDBMSとしてのインターフェイスと、OODBMSとしてのインターフェイスを持っています。今回は、このOODBMSとしてのインターフェイスだけを使用しています。データベースとしての詳細は、Cachéの開発元であるインターシステムズのホームページでご確認ください。


オブジェクト指向データベースとリレーショナル・データベースの違い

 両者の違いを示す次のような比ゆがあります。自動車をオブジェクト、車庫をデータベースとします。

 OODBMSの場合は、自動車をそのままの形で車庫に格納し、必要なときには、そのままの形で車庫から出して使用します。つまり、現実の世界と同じです。

 RDBMSの場合は、自動車を(そのままの形ではなく)ハンドルやドアなどの部品に分解し、部品ごとに決められた(車庫内の)置き場に保管します。必要なときには、各部品を各置き場から取り出し、車庫の外で元の自動車として組み立ててから使用します。各部品置き場はRDBMSのテーブル(ハンドル・テーブルやドア・テーブル)に相当します。車庫に複数台の自動車を入れるためには、別の自動車の部品と間違えないように印が必要です。その印が主キーや外部キーに相当します。

 オブジェクト指向システムであれば、その中はオブジェクトの集まりです。そのままの形で永続化できれば、いちばんシンプルです。RDBMSを使う場合であっても、O/Rマッピングツールなどを使って、RDBMSを意識することなく、インピーダンスミスマッチにも悩まされることなく永続化できれば、システム開発はシンプルになります。

 今回は、多くのアプリケーション・システムにおいて永続化が必要とされ、その解決方法にはいくつかの選択肢があることを解説しました。次回は簡単なオブジェクト・モデルを例にして、HibernateとCachéの使い方をJavaのソースコードや設定ファイルなどを示して紹介します。2つの永続化方式の概要や特徴などを確認できるでしょう。(次回に続く)

筆者プロフィール
村山 徹(むらやま とおる)
ネクストデザイン有限会社 代表取締役。
オブジェクト指向技術に惹かれ、管理者よりも技術者としての活動を優先すべく、1998年1月、現在の会社を設立する。以降、オブジェクト指向技術を使ったシステムの開発、セミナー講師、UMLツールの企画、開発、販売に携わる

  3/3  

 Index
対決! O/Rマッパー vs. オブジェクト指向DB(1)
Javaのオブジェクト永続化に何を選ぶ?
  Page 1
・はじめに
・本稿のもととなった開発事例について
  Page 2
・永続化問題のキーワード
Page 3
・永続化をスマートに解決する


対決! O/Rマッパー vs. オブジェクト指向DB


Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間