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

第2回 HibernateとCaché、Javaとの好相性はどっちだ

ネクストデザイン
村山 徹
2006/1/13

Cachéを使ったJavaオブジェクトの永続化

 次にオブジェクト指向データベースを使用する場合を見てみましょう。今回はCaché(バージョン5.0.11)を使用しています。なお、オブジェクト指向データベースの世界にはSQLのような標準規格がありません。従って、Caché以外のオブジェクト指向データベースを使用する場合には、本稿の内容とは異なるという点に注意してください。

ステップ1 ドメインモデルを作成する

 Hibernateの場合と同じです。

ステップ2 永続クラスを定義する

 Cachéでは、専用のGUIベースのツール(図3、以下Cachéスタジオ)を使って永続クラスを定義します。CaObjectクラスの定義内容は、リスト5のとおりです。ここには、Hibernateの場合とは違って、属性idがないことに注意してください。

図3 Cachéスタジオ

Class CaObject
 Extends %Persistent [ ClassType = persistent, ProcedureBlock ]  (1)
{
Property Name As %String;                                        (2)
Projection CompassProjection As %Projection.Java;                (3)
}
リスト5 CaObjectクラスの定義内容
(1)CaObjectを永続クラスとして定義する(Persistentを継承することで永続クラスになる)
(2)String型の属性Nameを定義する
(3)Javaソースファイルを自動生成するように指定する

 次にCachéスタジオのビルドアクションを実行すると、Javaソースコード「CaObject.java」が生成されます。CaObject.javaには永続化のための振る舞いが実装されています。従って、かなり多くのメソッド、ステートメントを含んでいますので、本稿では例示しません。実際のアプリケーション開発者も、その内容はブラックボックスとして扱います。

ステップ3 テーブルを作成する

 Cachéを使用するうえで、このステップを意識する必要はありません。テーブルに相当するものは、ステップ2のビルド時に作成されます。ほかのオブジェクト指向データベースの場合も、このステップは必要ないでしょう。

 しかし、Cachéの場合は少し違います。Cachéではオブジェクト・アクセスという機能によってオブジェクトはそのままの形で保存され復元されますが、それと同時に、RDBMSと同様にSQLを使用しても永続化されたオブジェクトにアクセスすることができます。オブジェクト指向データベースでは、永続化された大量のインスタンスを検索する場合やバッチ処理では、その実行速度が問題になることがあります。このような場合にSQLクエリを利用することができるのです。これはHibernateでも同じです(SQLに似たHibernateクエリ言語を使った検索ができます)。

ステップ4 アプリケーションコードを書く

 CaObjectのインスタンスを生成して永続化するコード(リスト6)を作成します。

Database db =
  CacheDatabase.getDatabase (url, username, password);      (1)
db.transactionStart();                                      (2)
CaObject caObject = new CaObject(db);                       (3)
caObject.setName("レポートを作成する");                        (4)
caObject.save();                                            (5)
db.closeObject(caObject.getOref());                         (6)
db.transactionCommit();                                     (7)
db.close();                                                 (8)
リスト6 CaObjectのインスタンスを永続化するコード

ステップ5 実行する

 リスト6のコードが実行されると、以下の処理が行われます。

(1) urlが指すCachéデータベースサーバに接続される
(2) トランザクションが開始される
(3) Cachéによって自動生成されたCaObject.javaのインスタンスが生成される
(4) 属性nameが設定される
(5) インスタンスが保存される
(6) インスタンスが終了される
(7) トランザクションがコミットされる
(8) データベース接続が終了される

 これで永続化できました。ここでHibernateの場合とCachéの場合を比較してみましょう。2つのアプリケーションコード(リスト4とリスト6の赤字部分)のコードを比べると、CaObjectのコンストラクタの引数が異なります。また、Hibernateでは、Session#save(Object object)であるのに対し、CachéではCaObject#save()です。この違いの理由の1つは、HibernateがJavaオブジェクト(POJO)を実行時にクラス拡張するのに対し、Cachéでは永続クラス自身を事前に自動生成する方式を採用しているためと思われます。

 小さな違いに見えますが、設計モデルの作り方によっては、大きな違いになる場合もあります。この点については、次回最終回で触れたいと思います。

 今回は簡単なオブジェクト・モデルを使って、HibernateとCachéの使い方について紹介しました。新規のシステム開発で、それぞれの永続化方式の使用手順や作業内容を理解できたと思います。次回(最終回)は、実際のシステム開発では当然必要となるクラスの継承やオブジェクトの関連の扱い方について紹介します。そして、本稿のテーマである「永続化方式を比較する」の結果について考えてみたいと思います。(次回に続く)

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

  3/3  

 Index
対決! O/Rマッパー vs. オブジェクト指向DB(2)
HibernateとCaché、Javaとの好相性はどっちだ
  Page 1
・はじめに
・Hibernateを使ったJavaオブジェクトの永続化
  ステップ1 ドメインモデルを作成する
  ステップ2 永続クラスとマッピング情報を作成する
  Page 2
  ステップ3 テーブルを作成する
  ステップ4 アプリケーションコードを書く
  ステップ5 実行する
Page 3
・Cachéを使ったJavaオブジェクトの永続化
  ステップ1 ドメインモデルを作成する
  ステップ2 永続クラスを定義する
  ステップ3 テーブルを作成する
  ステップ4 アプリケーションコードを書く
  ステップ5 実行する


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


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

注目のテーマ

Database Expert 記事ランキング

本日月間