プロダクトレビュー
話題のO/Rマッピングツール「Cayenne」を使う

米山学
株式会社クロノス
2004/7/24

 近ごろ、O/Rマッピング・フレームワークの話題をよく耳にします。HibernateやTorque、Castor、PriDEなど、O/Rマッピングのためのプロダクトも数多く登場してきています。この背景には、オブジェクト指向言語とリレーショナル・データモデルのインピーダンス・ミスマッチを解消するソリューションが渇望されているという状況もあり、Java開発者にとってO/Rマッピングに関する話題は今後も目が離せないものでしょう。

 さて、O/Rマッピングの概要に関する説明は、現在@ITでも連載中の「Hibernateで理解するO/Rマッピング」に譲るとして、本稿では数あるO/Rマッピングツールの中でも、最近注目が高まってきた「Cayenne」と呼ばれるO/Rマッピング・フレームワークについて、実際に使いながらマッピングツールとしての使い勝手を見てみます。

   Cayenneの構造と仕組み 

 Cayenne(カイエン)は日本語に訳すと「唐辛子」という変わったプロダクト名を持つO/Rマッピング・フレームワークです。2002年6月にアルファ版がリリースされてから2年ほど経過したため、それほど新しいプロダクトというわけではありません。しかしながら最近はTheServerSide.comなどの記事にも頻繁に取り上げられ、Hibernateとも比較されることで注目を集めてきています。

 Cayenneはオープンソース・ソフトウェアの開発を行っているコミュニティ「ObjectStyle」によって提供されており、誰でも無償で利用することができます。

 Cayenneは、ほかのO/Rマッピング・フレームワーク同様に、データベースのエンティティをJavaのオブジェクトとして扱うことができるような便利な機能を提供しているほか、データベースとのマッピング・ファイルを生成するAntタスクやGUIツールも提供しています。また、主キーの自動管理やテーブル間のリレーションにも対応しており、ローカルおよび分散環境でのキャッシュ機能や楽観ロックのサポートなどの特徴も備えています。

 CayenneをHibernateと比較した場合、Outer Joinをサポートしていないなど機能面の不足が多少見受けられる半面、便利な点として付属のGUIツールを挙げることができます。パフォーマンスの比較に関しては、単純なベンチマーク・テストでは両者ともそれほど変わりがないという記事が公表されています。詳しくは「Cayenne And Hibernate」を参照してください。

 実際にCayenneを使ってみる前に、その構造と仕組みを見てみましょう。

DataObjectインターフェイスとCayenneDataObjectクラス

 CayenneではRDBのテーブル(エンティティ)は、org.objectstyle.cayenne.DataObjectインターフェイスによって表現されます。DataObjectインターフェイスにはエンティティ・クラスとして最低限必要なメソッドが定義されており、そのデフォルト実装としてorg.objectstyle.cayenne.CayenneDataObjectクラスが用意されています。

図1 アプリケーションはDataObjectによってテーブルに対する操作を行う

 実際にCayenneを利用するアプリケーション側では、このCayenneDataObjectを継承した具象DataObjectクラス(エンティティ・クラス=各テーブルを表現)から生成されたインスタンス(エンティティ・オブジェクト=各レコードを表現)を利用してデータベースアクセスのプログラムを記述します。

 例えば、データベースにEmployeeテーブルとDepartmentテーブルがある場合、このエンティティ・クラスは図2のクラス図のような階層構造となります。

図2 エンティティ・クラスの継承関係を表すクラス図

DataContextクラス

 org.objectstyle.cayenne.access.DataContextクラスは、エンティティ・オブジェクトの取得や永続化、システム・レベルのサービスに関する機能を提供します。Cayenneを利用するアプリケーションはこのDataContextを介してエンティティ・オブジェクトを取得し、データベースに対する操作(SQL文の発行、コミットやロールバックなど)を実行します。このDataContextはユーザー・セッションが持続している間維持されます。

 また、Cayenneでは1つのアプリケーションで複数のデータベースを扱うことをサポートしています。その場合には接続するデータベースごとにDataContextを作成します。

図3 DataContext

ObjectId

 Cayenneのエンティティ・オブジェクトはObjectIdによって識別されます。ObjectIdは主キーを抽象化したものであり、org.objectstyle.cayenne.ObjectIdクラスのインスタンスとして各エンティティ・オブジェクトに関連付けられます。つまり、図4に示すようにテーブルの各レコードに対してエンティティ・オブジェクトが対応し、主キーのフィールドに対応するObjectIdオブジェクトがそれぞれのエンティティ・オブジェクトにコンポジット集約として関連付けられるわけです。なお、このObjectIdの生成や管理はCayenneが受け持ちます(開発者が生成してエンティティに関連付けることも可能です)。

図4 テーブルとエンティティ・オブジェクト

Cayenneのインストールと環境のセットアップ

 次のページからCayenneを実際に使いながら、その特徴を見ていきます。その前にインストールを行ってみましょう。その後、簡単なサンプル・コードを通して使い方を紹介していきます。この原稿を書いている時点での最新バージョンはCayenne 1.1 (Milestone Release 7) です。ダウンロードページ(http://objectstyle.org/cayenne/download.html)から「cayenne-1.1M7_1.tar.gz」をダウンロードして任意のディレクトリに解凍しておいてください。

 なお、今回紹介するサンプルではデータベースにMySQLを使っていますが、CayenneではほとんどのメジャーなRDBをサポートしています。MySQL以外のRDBを使用する場合には、それぞれの環境に応じて適宜本文を読み替えてください。また適切なJDBCドライバのセットアップも済ませておいてください。

 アーカイブを解凍した後は「lib」ディレクトリに格納されている「cayenne.jar」をクラスパスに設定するだけでセットアップは完了です。

1/3

 INDEX

話題のO/Rマッピングツール「Cayenne」を使う
Page1
Cayenneの構造と仕組み 
  Page2
サンプルアプリケーションを作成する
  Page3
Cayenneを実際に使ってみる




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

注目のテーマ

Java Agile 記事ランキング

本日 月間