連載 役に立つXMLツール集(6)
CastorでオブジェクトをRDBにマッピング
XMLプログラミングでは、DOMやSAXといったAPIを使用すると単調なコードを繰り返し書くことになり生産性が上がらないものだ。本連載では開発者が“楽をする”ために役立つXML関連ツールを紹介していく。(編集局) |
www.netpotlet.com
原田洋子
2004/4/9
主な内容 |
もし、Javaの開発者にデータベースを組み合わせたアプリケーションを作ったことがあるかと問い掛けたら、圧倒的に「ある」という返事が返ってくるでしょう。サーバサイドになるとほぼ全員が「ある」と答えるはずです。データベースにアクセスするプログラムは頻繁に使うので、自分なりに工夫したAPIを作っている人がかなりいることでしょう。
ただ、個人やある部署が作ったAPIは特定の状況下でのみ動作するようになっていることが多く、データベースシステムが変わったり、要件が変わったりすると修正や拡張が必要になることが多いものです。この点、O/Rマッピングと呼ばれるツールは通常、いくつものデータベースシステムに対応しているので、OracleでもPostgreSQLでも同じプログラムで動きます。また、大勢の開発者が培ってきたノウハウが詰め込まれているので、さまざまなケースにも対応できるようになっています。
本連載では、普遍的に使えるデータベースアクセス方法のうち、データバインディングツールが提供する機能によるものを紹介します。
O/Rマッピングツールの特徴
今回はデータバインディングツールであるCastorが提供するO/Rマッピング、Castor JDOを取り上げます。Castor JDOの話を始める前に、O/Rマッピングツールがどのようなものかを見ておきましょう。
プログラムからデータベースを使うときに、まず考えなければならないのが図1に示す、
- データベースとの接続をどうするか
- どのようにデータベースを操作するか
の2点です。1の接続については、データベースを扱うAPIやツールがカバーする範囲か、一般的な接続APIに任せるのか、といった程度の違いを考慮すれば十分ですが、2の操作についてはさまざまな方法があるので調査が必要です。
図1 データベースアクセスに必要な機能 |
近年、データベースによってはXMLやオブジェクトをそのまま扱えるものも出てきましたが、既存リソースの再利用や使い勝手、性能、価格などを考慮すると、現実的な選択はリレーショナルデータベースになります。Javaのようなオブジェクト指向言語からリレーショナルデータベースを操作する場合、一方はリレーショナルモデル、もう一方がオブジェクトモデルというようにモデルがまったく違うので、これをどこでどのように解決するのかが問題になります。モデルの違いを解消するために行われるのが2つのモデル間でのマッピング、つまり、O/Rマッピングです。世間に出回っているO/Rマッピングツールの一番の相違点はこのマッピング方法にあります。
O/Rマッピングを細かく分けると次の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に相当する操作をどのように実行するかですが、大まかな分け方をすると
- API方式
- クエリ方式
- 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は本連載の「第3回 Castorでデータバインディングに挑戦しよう」で紹介したデータバインディングツールCastorが提供するO/Rマッピング機能です。第3回ではオブジェクトモデルからXMLモデルへのマッピング時に出力を加工する目的で、mapping.xmlで定義したマッピングルールを適用しました。CastorのマッピングルールはXMLインスタンスをオブジェクトモデルにマップする場合にも使われますが、オブジェクトモデルからリレーショナルモデルにマップするところでも利用できます(図2)。この機能により静的マッピングを行うのがCastor JDOです。
図2 Castorのマッピング |
Castor JDOの特徴
もう少し詳しく、見ていきましょう。
まず、データベースとの接続ですが、Castor JDO自身はこの部分をカバーしていません。ただし、Jakarta Commons DBCPやPoolManのような一般的な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 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マッピングツール概要 |
|
「連載 役に立つXMLツール集」 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|