連載 役に立つXMLツール集(6)
CastorでオブジェクトをRDBにマッピング

XMLプログラミングでは、DOMやSAXといったAPIを使用すると単調なコードを繰り返し書くことになり生産性が上がらないものだ。本連載では開発者が“楽をする”ために役立つXML関連ツールを紹介していく。(編集局)

www.netpotlet.com
原田洋子
2004/4/9

O/Rマッピングツール概要

主な内容
O/Rマッピングツール概要

Castor JDOとは
Castorの入手とセットアップ
サンプルアプリケーションの設計
アプリケーション作成
まとめ
サンプル・ダウンロード&参考サイト

 もし、Javaの開発者にデータベースを組み合わせたアプリケーションを作ったことがあるかと問い掛けたら、圧倒的に「ある」という返事が返ってくるでしょう。サーバサイドになるとほぼ全員が「ある」と答えるはずです。データベースにアクセスするプログラムは頻繁に使うので、自分なりに工夫したAPIを作っている人がかなりいることでしょう。

 ただ、個人やある部署が作ったAPIは特定の状況下でのみ動作するようになっていることが多く、データベースシステムが変わったり、要件が変わったりすると修正や拡張が必要になることが多いものです。この点、O/Rマッピングと呼ばれるツールは通常、いくつものデータベースシステムに対応しているので、OracleでもPostgreSQLでも同じプログラムで動きます。また、大勢の開発者が培ってきたノウハウが詰め込まれているので、さまざまなケースにも対応できるようになっています。

 本連載では、普遍的に使えるデータベースアクセス方法のうち、データバインディングツールが提供する機能によるものを紹介します。

O/Rマッピングツールの特徴

 今回はデータバインディングツールであるCastorが提供するO/Rマッピング、Castor JDOを取り上げます。Castor JDOの話を始める前に、O/Rマッピングツールがどのようなものかを見ておきましょう。

 プログラムからデータベースを使うときに、まず考えなければならないのが図1に示す、

  1. データベースとの接続をどうするか
  2. どのようにデータベースを操作するか

の2点です。1の接続については、データベースを扱うAPIやツールがカバーする範囲か、一般的な接続APIに任せるのか、といった程度の違いを考慮すれば十分ですが、2の操作についてはさまざまな方法があるので調査が必要です。

図1 データベースアクセスに必要な機能

 近年、データベースによってはXMLやオブジェクトをそのまま扱えるものも出てきましたが、既存リソースの再利用や使い勝手、性能、価格などを考慮すると、現実的な選択はリレーショナルデータベースになります。Javaのようなオブジェクト指向言語からリレーショナルデータベースを操作する場合、一方はリレーショナルモデル、もう一方がオブジェクトモデルというようにモデルがまったく違うので、これをどこでどのように解決するのかが問題になります。モデルの違いを解消するために行われるのが2つのモデル間でのマッピング、つまり、O/Rマッピングです。世間に出回っているO/Rマッピングツールの一番の相違点はこのマッピング方法にあります。

 O/Rマッピングを細かく分けると次の2つに分類できます。

  1. 静的マッピング
    オブジェクト構造をデータベースのテーブルにマッピングする
     
  2. 動的マッピング
    SQL文生成から実行までの操作をマッピングする

 1の静的マッピングについては、単に構造のマッピングのみを行うツールとマッピングに相当する構造を持つクラス定義とテーブル定義までも自動生成するツールがあります。本記事で紹介するCastor JDOは前者ですが、最近人気のHibernate(はいばねーと)やJSR-12 JDO(Java Data Object)、Apache DBプロジェクトのTorque(とーく)は後者です。自動生成まで行ってくれるツールは自分でやらなければならない部分が少ない半面、スタート地点をデータベースにできないので、すでにデータベースの中にある資産に適用しにくいという欠点があります。

 マッピングルールはほぼどのツールでもXMLで記述します。Javaのクラスを自動生成するツールは、XMLインスタンスからクラス定義を作り出します。このため、構造を定義したスキーマからクラス定義を生成する、いわゆるデータバインディングツールとしての機能はないものの、XMLモデルからオブジェクトモデルへのマッピング機能を提供するので、HibernateなどのO/Rマッピングツールをデータバインディングツールと呼ぶことがあります。

 2の動的マッピングはSQL文のSELECTやINSERT、UPDATEに相当する操作をどのように実行するかですが、大まかな分け方をすると

  1. API方式
  2. クエリ方式
  3. 1と2の両方が使えるハイブリッド方式

の3種類になります。例えば、Castor JDOはSELECTについては2ですが、INSERTとUPDATEは1です。Torqueはすべて1で、Hibernate、JSR-12 JDOでは3が採用されています。APIのみで対応する方法はオブジェクト指向的には最もきれいなやり方で、SQL文の経験がない場合はこれが一番便利でしょう。逆に、SQL的な発想でデータベース操作を考える癖がついてしまっていると、やりたいことをストレートに実行できないジレンマを感じるところです。結局、1と2の利点を取り入れた3のハイブリッド方式がいいということになり、最近のO/Rマッピングツールではこの方式が採用されることが多くなりました。

 ここで、クエリ方式と一言でいっていますが、クエリ言語はSQLではなく、表1に示すように、ツールごとに専用の言語があります。

ツール名 クエリ言語
Castor JDO ODMG 3.0 OQL(Object Query Language)のサブセット
Hibernate HQL(Hibernate Query Language)
JSR-12 JDO JDOQL(Java Data Objects Query Language)
表1 O/Rマッピングツールのクエリ言語

 いずれのクエリ言語もSQLによく似ていますが、オブジェクトに対してクエリを出す点がSQLとの一番の違いです。一方、ツールが違うとクエリ言語が違うのはやっかいなところです。将来的には標準仕様のJDOQLに統合されるかもしれませんが、現状ではそれぞれの言語を覚えなければなりません。

Castor JDOとは

 Castor JDOは本連載の「第3回 Castorでデータバインディングに挑戦しよう」で紹介したデータバインディングツールCastorが提供するO/Rマッピング機能です。第3回ではオブジェクトモデルからXMLモデルへのマッピング時に出力を加工する目的で、mapping.xmlで定義したマッピングルールを適用しました。CastorのマッピングルールはXMLインスタンスをオブジェクトモデルにマップする場合にも使われますが、オブジェクトモデルからリレーショナルモデルにマップするところでも利用できます(図2)。この機能により静的マッピングを行うのがCastor JDOです。

図2 Castorのマッピング


Castor JDOの特徴

 もう少し詳しく、見ていきましょう。

 まず、データベースとの接続ですが、Castor JDO自身はこの部分をカバーしていません。ただし、Jakarta Commons DBCPPoolManのような一般的なAPIを利用する接続、J2EEサーバやサーブレットコンテナを介した接続に対応しています。詳細については次のドキュメントを参照してください。

 次にマッピングですが、静的マッピングはオブジェクト構造をデータベースのテーブルにマッピングするだけです。マッピングルールからクラス定義を生成しません。このため、あらかじめデータベースにテーブルとテーブルに対応したクラス定義を作っておかなければなりません。

 動的マッピングはすでに説明したように、SQL文のINSERTやUPDATE相当の操作はCastor JDOが提供するAPIを使いますが、SELECTについてはOQLで記述したクエリを実行する方式になっています。

JSR-12 JDOとCastor JDOとの関係

 Castor JDOという名前からJCPのJSR-12で仕様が決められたJDO(Java Data Objects)の実装であるかのような誤解を持たれることがよくあります。CastorのJDOもJava Data Objectsの略で提供する機能も似ていますが、JSR-12のJDOの実装ではありません。CastorはデータバインディングもO/RマッピングもJCPで仕様ができる前からあった古参のツールだったため、JAXBにもJDOにも対応していないものになってしまいました。JSR-12 JDOとCastor JDOの違いについては次のドキュメントを参照してください。

 では、Castor JDOを使ったサンプルを紹介していきましょう。

Castorの入手とセットアップ

 Castor JDOはCastorの一部ですから、本連載第3回の「Castorの入手とセットアップ」を参照してください。

 第3回ではバージョン0.9.5.1を使いましたが、その後バグフィックス版がリリースされたので、今回は0.9.5.3を使って動作を確認しています。なお、今回はO/Rマッピングを行いますので、データバインディング機能だけのアーカイブcastor-0.9.5.3-xml.jarでは動きません。

 今回もEclipse上で開発/動作することを前提としますので、そのためのセットアップを行っておきます。

Eclipseのセットアップ

1. Javaプロジェクト作成(例:nymphプロジェクト)
 ファイル → 新規 → プロジェクト → Java(左ペイン) →
 Java プロジェクト(右ペイン) → 次へ → プロジェクト名(nymph) → 終了

2. Javaのビルド・パス設定
 パッケージ・エクスプローラーでプロジェクト(nymph)選択 →
 右クリック → プロパティー → Javaのビルド・パス(左ペイン) →
 ライブラリー選択 → 外部 JAR の追加 →
 castor-0.9.5.3.jar、jta1.0.1.jar、commons-logging.jar ※注1
 JDBCドライバ(postgresql.jar など ※注2 )のアーカイブを追加する

※注1
castor-0.9.5.3.jar、jta1.0.1.jarはcastor 0.9.5.3のアーカイブに含まれています。commons-logging.jarはhttp://jakarta.apache.org/からダウンロードします。

※注2
castor-0.9.5.3にpostgresql.jarが付属しているのですが、うまく動かないので、PostgreSQL付属のドライバを使います。 

3. フォルダ作成

ソース・フォルダ
 パッケージ・エクスプローラーでプロジェクト(nymph)選択 →
 右クリック → 新規 → ソース・フォルダー →
 フォルダー名(src) → 終了

スキーマ用フォルダ
 パッケージ・エクスプローラーでプロジェクト(nymph)選択 →
 右クリック → 新規 → フォルダー →
 フォルダー名(schemas) → 終了

XML文書用フォルダ
 パッケージ・エクスプローラーでプロジェクト(nymph)選択 →
 右クリック → 新規 → フォルダー → フォルダー名(docs)→ 終了

 必要な環境が整ったので、次ページからアプリケーションの作成に取り組みます。(次ページへ続く

  1/3 サンプルアプリケーションの設計

 Index
連載 役に立つXMLツール集(6)
CastorでオブジェクトをRDBにマッピング

O/Rマッピングツール概要
Castor JDOとは
Castorの入手とセットアップ

 

サンプルアプリケーションの設計

 

アプリケーション作成
まとめ
サンプル・ダウンロード&参考サイト

 

「連載 役に立つXMLツール集」


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間