トップ 差分 一覧 ソース ヘルプ RSS ログイン

CayenneIntegration

Cayenneとの連携

Clickでは、Apache Cayenneとの連携のために、Click Extrasにおいて以下のクラスを提供しています。

  • CayenneForm - Cayenneのエンティティオブジェクトに編集フォームを提供するためのFormコントロールの拡張。
  • CayenneTemplate - Spring DAO テンプレートパターンによる、拡張のための基底DAO/サービスクラス。
  • DataContextFilter - リクエストにDataContextオブジェクトをバインドするサーブレットフィルター。
  • PropertySelect - DataObjectのプロパティを選択するコントロール(<select></select>)。
  • QuerySelect - CayenneのQueryの結果を選択するコントロール(<select></select>)。
  • TabbedCayenneForm - CayenneFormのタブ版。

現在Cayenneを利用したコントロールは、数値型のひとつのカラムからなるプライマリーキーを持っているDataObjectしか扱えないことに注意してください。

それでは利用方法を順番に見て行きましょう。

 DataContextFilterの設定

DataContextFilterは、リクエストにDataContextオブジェクトをバインドするサーブレットフィルターです。デフォルトではクラスパスのルートに存在するcayenneの設定ファイル(cayenne.xml他)を読み込みます。このフィルターは、セッションスコープにバインドされたコミットされていない変更を自動的にロールバックします。もしくは、それぞれのリクエストの最後で、コミットされていない変更を自動的にロールバックします。

web.xmlで以下のように設定し、ClickServletにフィルタを適用します。

上記の設定では、データベースの変更をこのアプリケーションしかしないことを前提にしています。

対象となるデータベースへの変更が、複数のアプリケーションから行われる場合には下記のように記述しますます。

session-scope: セッションスコープ vs リクエストスコープ

デフォルトでは、DataContextオブジェクトはユーザーのHttpSessionに格納されます。

もちろん、リクエスト毎に新しいDataContextを作成するよう、フィルターを設定することも可能です。データベースに対して排他的なアクセスが可能なweb アプリケーションに対しては有効な選択肢です。

しかし、複数のwebアプリケーションでデータベースを共用するような場合には、サーブレットフィルターの初期化パラメータsession-scopeをfalseにして、リクエストごとのDataContextを使うべきでしょう。

shared-cache: 共用キャッシュ

デフォルトでは、DataContextオブジェクトはCayenneのshared cacheを使うよう生成されます。これも、データベースに対して排他的なアクセスが可能なweb アプリケーションに対しては有効な選択肢です。

しかし、複数のwebアプリケーションでデータベースを共用するような場合には、サーブレットフィルターの初期化パラメータshared-cacheをfalseにして、shared cacheを無効にするべきでしょう。

 CayenneFormの使用

CayenneFormは、DataObjectオブジェクトのINSERTとUPDATEをサポートしています。CayenneFormは、必須のプロパティに関してはフィールドのrequiredプロパティが自動的にtrueに設定され、max length validation制約も設定されます。

以下の例は、Organisationオブジェクトを生成/更新するためのページです。既存のOrganisationオブジェクトを編集する場合、編集対象のオブジェクトをリクエストパラメータとして渡します。それ以外の場合はsaveChanges()メソッドの呼び出しで新しいOrganisationオブジェクトが作成されます。

このなかでgetDataObject(false)という呼び出しがありますが、フィールドの値をデータオブジェクトに適用することなく、DataObjectを取得しています。この手法は、既にオブジェクトがあってフィールド上の変更を適用したくない場合に大変有効です。

onOkClickedメソッドでは、サービスクラスないしDAOパターンを用いることでDataObjectを保存することもできます。

 CayenneTemplateの使用

Spring DAO テンプレートパターンによる、拡張のための基底となるDAO/サービスクラスです。このクラスは、独自のpublicインターフェースを提供するカスタムDAOやサービスサブクラスを拡張して作成するために用意されています。多くの便利なDataContext用のメソッドを提供しており、APIドキュメントやexamplesを参考にすると良いでしょう。

 PropertySelectの使用

PropertySelectは、DataObjectのリレーションシッププロパティ(これもまたDataObjectです)を選択するためのコントロールです。このコントロールは、CayenneForm上でしか動きません。また、今のところ単一の要素の選択しかサポートしてません。

PropertySelect使用例

例えばPetTypeというDataObjectをプロパティに持つPetというDataObjectがあるとします。

このPetTypeプロパティを編集するのにCayenneForm上でPropertySelectを利用します。この例では、PetTypeのnameプロパティが select の optionラベルとして出力されます。

特にクエリを指定することなしに、コントロールはプロパティのクラスに基づき単純なSelectQueryを生成します。