ドキュメント

Cayenneによるマッピング

Cayenne とはデータベースとAipoとをつなぐ、いわば橋渡しのようなプログラムです。
AipoはCayenne を通じてデータベースに接続して、必要なデータを取得したり、追加したりしています。
Cayenne を利用するためには、

  1. 実際にデータベースにあるテーブル構造を、Cayenneにも設定しておく
  2. テーブル構造ごとのJavaのクラスファイルを作成する

の2点必要があります。
この設定とクラスファイルの作成の両方を行うためのツールがCayenne Modeler です。
Cayenne Modelerでテーブル構造に合った「Cayenneの設定ファイル(xml)」および「オブジェクトモデルのJava クラス」を、以下の手順で作成します。

CayenneModelerの起動

CayenneModelerは (Cayenneホーム)\bin\CayenneModeler.exeに入っています。
CayenneホームはC:\home\common\cayenne-2.0.4に入っているものをご利用ください。
無い場合は下記から2.0.4のバージョンをダウンロードしてください。

http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/cayenne/cayenne-2.0.4-win.zip

※3.0.2などの3系は不可

プロジェクトファイルを開く

[File]-[Open Project]で、プロジェクトファイルを開きます。このファイルは、

(プロジェクトルート)\oms\src\main\webapp\WEB-INF\cayenne.xml

にあります。他人のcayenne.xmlを編集しないようにファイルのパスを確認します。

SharedDomainMapを開く

左の枠から、SharedDomainMap を選択して、開きます。

DbEntityを追加する

ツールバーからCreateDbEntity(表のようなアイコン)をクリックしてDbEntity を追加します。
これがデータベースのテーブル構造に相当します。

DbEntityにテーブルの情報を入力する

Entity タブ

項目 設定内容 設定の意味
DbEntity Name eip_t_test テーブル名
Schema スキーマ
PK Generation Strategy Database-Generated プライマリキーを生成する仕組みを定義します。
ここではPostgreSQL で生成する設定とします。

Attributes タブ

3. テーブルの設計の表の定義を、ここに書き写します。
Attributes タブの中のCreate Attributeボタンを押すと、要素が追加されます。
Mandoatory とは、"NOT NULL"ということです。
下記のように要素を追加します。

Name Type PK Mandatory Max Length Scale
CREATE_DATE DATE 4
NOTE VARCHAR
TEST_ID INTEGER 4
TEST_NAME VARCHAR 99
UPDATE_DATE TIMESTAMP 8
USER_ID INTEGER 4

ObjectEntity を作成する

設定が完了したDbEntity の、Attributes タブの中にあるCreateObjEntity(緑のC+のアイコン)をクリックします。
すると、左のリストに、緑のCのアイコンでEipTTestというのが追加されます。
これが、Java クラスに対する設定となります。

作成したテーブルとクラスに対し他のテーブルとクラスを関係付ける

ツリービューから先ほど作ったテーブルeip_t_testを選択し、以下の内容を追加します。

Relationships タブ

このタブで他のテーブルとの関係を定義します。
Relationships タブの中のCreateRelation shipボタンを押して以下の項目を追加してください。

Name Target To Dep PK To Many
turbineUser turbine_user (SecuritySharedDomainMap)

追加したら、その項目を選択しRelationships タブの中のDatabase Mapping ボタン(紫色のI字が書かれたボタン)をクリックして、以下の項目を入力します。

Database Mappingの設定
項目 設定内容 設定の意味
Relationship turbineUser 関連付けるテーブル名
Reverse Relationship eipTTest 自分のテーブル名

そしてダイアログ右側のAddボタンを押して以下の項目を入力します。

Database Mappingのjoins設定
Source Target
USER_ID USER_ID

次にEipTTestクラスを選択し、Relationships タブからCreateRelationshipボタンを押して上記と同様の内容を登録します。
DatabaseMappingに対応する部分(Edit Relationship)は自動で作成されるので省略します。

Relationships タブの設定
Name Target Semantics Delete Rule Used for Locing
turbineUser TurbineUser
(SecuritySharedDomainMap)
to one No Action

Cayenne.xml の保存

以上の設定が完了したら、cayenne.xml を保存します。
ツールバーからSave をクリックしてください。
警告が出ますが、無視してかまいません。

クラスの作成

[Tools]-[Generate Classes]を選択し、Code Generation画面を開きます。
Output Directoryが、使用しているEclipseプロジェクトのディレクトリで、

(プロジェクトルート)\oms\src\main\java

とします。また、Entities タブで、EipTTestだけが選択されていることを確認します。
そのほかの設定は変更する必要はありません。
設定ができたら、Generate をクリックします。
Classgeneration finished のメッセージが出たら成功です。
CayenneModelerは終了してもかまいません。

プライマリキーを操作するメソッドの作成

先ほどの操作によりCayenneが

(プロジェクトルート)\oms\src\main\java\com\aimluck\eip\cayenne\om\portlet\EipTTest.java

に生成したEipTTest.javaにプライマリキーを操作するメソッドgetTestID()とsetTestID()を定義します。
EipTTodo.javaの内容をコピー&ペーストして書き換えましょう(書き換え箇所を漏らさないように気をつけます)。

EipTTest.java

package com.aimluck.eip.cayenne.om.portlet;

import org.apache.cayenne.ObjectId;

import com.aimluck.eip.cayenne.om.portlet.auto._EipTTest;

public class EipTTest extends _EipTTest {

  public static final String TEST_NAME_COLUMN = "TEST_NAME";

  public Integer getTestId() {

    if (getObjectId() != null && !getObjectId().isTemporary()) {

      Object obj = getObjectId().getIdSnapshot().get(TEST_ID_PK_COLUMN);

      if (obj instanceof Long) {

        Long value = (Long) obj;

        return Integer.valueOf(value.intValue());

      } else {

        return (Integer) obj;

      }

    } else {

      return null;

    }

  }

  public void setTestId(String id) {

    setObjectId(new ObjectId("EipTTest", TEST_ID_PK_COLUMN, Integer.valueOf(id)));

  }

}