Oracle ADF Business Componentsを使用して複数のデータベース用のアプリケーションを開発する方法
ADF Product Management、Blaise Ribet
2010年1月

このドキュメントでは、複数のデータベース上で稼働するFusion WebアプリケーションをOracle JDeveloper 11gで開発する際のベスト・プラクティスについて説明します。 Fusionテクノロジー・スタックを使用して構築されたアプリケーション(Oracle ADF Business Components、Oracle ADFコントローラ、Oracle ADF Faces)は、Oracle、SQL Server、DB2および他の多くのデータベースでサポートされます。すべてを記述したリストは、ドキュメント『 JDeveloper certification information』にあります

サポートされていない機能
複数のデータベース上で稼働するアプリケーションを開発する場合は、一部の機能がサポートされないため、 それらは使用しないようにしてください。

自動生成された主キー
自動生成された主キー列(SQL ServerのIDENTITY列)をデータベースに含めることはできません。 この種類の主キーには、代わりにOracle Application Development Framework Business Components(Oracle ADF BC)で生成された一意のIDを使用します(主キー生成の設定の項を参照してください)。

エンティティ・オブジェクトのバッチ更新および 挿入
エンティティ・オブジェクトのバッチ更新機能はサポートされません(このオプションはエンティティ・オブジェクトの概要エディタのTuningセクション で設定します)。


ラージ・オブジェクト型およびイメージ型
ラージ・オブジェクト型およびイメージ型はサポートされません。 これには、SQL Serverのnvarchar(max)型、varchar(max)型およびvarbinary(max)型と、DB2のLOB型が含まれます。

ビュー・オブジェクト問合せでのユーザー定義関数の呼出し
ユーザー定義のデータベース関数の呼出しはデータベースの種類によって異なるため(たとえば、 SELECT文でSQL Serverのユーザー定義関数を呼び出す場合は、関数名に接頭辞としてスキーマ名を付ける必要があります)、設計時にビュー・オブジェクトに対して定義 する問合せには、ユーザー定義のデータベース関数の呼出しを含めないようにする必要があります。 ビジネス・ロジックは中間層に実装することをお薦めします。 データベース・トリガーからユーザー定義関数を呼び出すか、ビュー・オブジェクトの問合せをランタイム・コードに定義することもできます。ランタイム・ コードには、データベースの種類ごとに異なる問合せを定義できます。

ビュー・オブジェクトの自動リフレッシュ
ビュー・オブジェクトのAuto Refreshプロパティ(プロパティ・インスペクタのTuningセクションで設定)はサポートされません。


ビュー・オブジェクトのプリフェッチ・サイズ
ビュー・オブジェクト概要エディタのTuningセクションには、データベースから取得する行数を設定するオプションがあります。 この設定は、Oracle以外のデータベースではサポートされません。

ビュー・オブジェクトのレンジ・ページング
ビュー・オブジェクトのアクセス・モードをRange Paging、Range Paging Auto PostまたはRange Paging Incrementalに設定することはできません。

データベース接 続の作成とJDeveloperへのJDBCドライバの登録
Fusion Webアプリケーションを構築する前にデータベース接続を作成する必要があります。 Oracle以外のデータベースを対象にして開発する場合は、適切なJDBCドライバをJDeveloperに登録することも必要です。 これら2つの作業は、次の手順でまとめて実行できます。
  1. 作業を開始する前に、JDBCドライバのJARファイルがローカル・マシン上に存在することを確認してください。
  2. JDeveloperでデータベース・ナビゲータを開きます(「 View」→「 Database」→「 Database Navigator」)。 「 IDE Connections」ノードを右クリックして、「 New Connection」 を選択します。
  3. Create Database Connectionダイアログで、接続名を入力し、開発対象のデータベースに使用する接続タイプを選択します。
  4. ユーザー名およびパスワードを入力します。 残りの設定項目を入力するか、「 Enter Custom JDBC URL」を 選択してJDBCのURLを入力します。
  5. JDBCライブラリを登録するには、「 Browse...」をクリックし、Select Libraryダイアログで「 New」 をクリックしてドライバ用の新しいライブラリを作成します。
  6. Create Libraryダイアログで、ユーザー・ライブラリを作成してドライバのjarファイルのエントリを追加します。
  7. Test Connection」をクリックして新しい接続をテストし、「 OK」をクリックします。 接続が成功していれば、Database Navigatorでデータベース・オブジェクトを参照できます。
これで、JDBCドライバがJDeveloperに登録されました。同じ種類のデータベースに対して他に も接続を作成する場合は、新しいJDeveloperライブラリを作成する必要はありません。今作成したJDeveloperライブラリを選択できます。

適切なデフォルト設定の設定

ベスト・プラクティスを適用しやすくするために、いくつかのデフォルト設定を選択できます。
  • 複数のエンティティ・オブジェクトを使用するビュー・オブジェクトでは、ANSI形 式の外部結合構文を使用します。Tools」→「 Preferences」の順に選択した後、「 Business Components」→「 View Objects」の順に選択します。 「 Use Ansi style outer-join syntax while generating SQL for join view objects」を選択します。
  • デフォルトで宣言的SQLビュー・オブジェクトを作成します。宣言的 SQLビュー・オブジェクトのSQLは実行時に生成されます。 「 Tools」→「 Preferences」の順に選択した 後、「 Business Components」→「 View Objects」の順に選択します。 次のオプションを選択します。
    • Enable Declarative SQL mode for new objects
    • Include all attributes in runtime-generated query
Business Componentsプロジェクトの作成および初期化
  1. New Gallery(「 File」→「 New」)から、新しいFusion Webアプリケーションを作成します。 または、既存のアプリケーションに新しいOracle ADFモデル・プロジェクトを作成します。
  2. New Galleryから、表からのビジネス・コンポーネントを作成します。
  3. Initialize Business Components Projectダイアログで、先ほど作成したデータベース接続を選択します。 接続のドロップダウン・リストに目的のデータベース接続が表示されない場合は、「 Browse」をクリックして接続を選択するか、「 Add」 をクリックして新しい接続を作成します。
  4. SQL Flavorに「 SQL92」を選択します。
  5. Javaタイプ・マップを選択します。
主キー生成の設定
主キー用に一意の識別子を生成する必要があ る場合は、次の手順を実行します。

1. 一意ID表の作成
Oracle ADF BCの一意ID生成機能では、使用できるIDの範囲と順序内の最後のIDを指定するのにデータベース表を使用します。 S_ROW_IDという名前のデータベース表を作成し、次の書式を使用して、表にデータを1行追加します。
列名 データ型 コメント
START_ID NUMERIC(38,0) 範囲の開始ID。 重複キー・エラーを発生させないためには、データベースに存在するどの主キー値よりもこの値を大きくしておく必要があります。
NEXT_ID NUMERIC(38,0) 現行範囲内で次に使用できるID(オプション)。
MAX_ID NUMERIC(38,0) 範囲内で一番大きいID。
AUX_START_ID NUMERIC(38,0) 予備ブロックの範囲の開始ID(予備ブロックが使用できない場合は0を使用)。
AUX_MAX_ID NUMERIC(38,0) 予備ブロックの範囲で一番大きいID(予備ブロックが使用できない場合は0を使用)。

2. 表への接続の作成
アプリケーションに、S_ROW_ID表を含むデータベースを指すデータベース接続を、ROWIDAM_DBという名前で作成します。 または、Oracle ADF BCプロジェクトのプロパティを編集し、プロジェクトの実行構成に次のJavaオプションを追加します。
 -Djbo.rowid_am_conn_name= appconnection
appconnectionは、S_ROW_ID表を指すデータベース接続の名前です。

3. 主キー属性の構成
主キー属性のための一意IDを生成するには、エンティティ・オブジェクト属性を編集し、属性の値に次の式を入力します。
oracle.jbo.server.uniqueid.UniqueIdHelper.getNextId()

主キー生成の制限事項
すべての主キーはS_ROW_ID表に含まれる単一の行から生成されるため、同じキー順序がアプリケーション内のすべてのエンティティ・オブジェクトで共 有されます。

Business Componentsの開発時


使用できる場合は必ず宣言的SQLモードのビュー・オブジェクトを使用する
ビュー・オブジェクトで宣言的SQLモードを使用すると、Where句のSQLは実行時に 生成されます。 そのため、プロジェクトのSQLスタイルに合ったSQLをOracle ADFで生成できます。 グローバル・プリファレンスとしてEnable Declarative SQL Modeを選択してからビジネス・コンポーネントを作成すると、すでにこのデフォルトが選択された状態になります。 そうでない場合は、ビュー・オブジェクトの問合せを編集してSQLモードとしてDeclarativeを選択すれば、SQLモードを変更できます。

バインド変数にJDBC Positional Binding Styleを使用する
Oracle以外のデータベースを対象に開発する場合は自動的にこのスタイルが選択される ため、何もする必要はありません。 Oracleデータベースを対象に開発する場合は、ビュー・オブジェクトにバインド変数を作成する前にこのオプションを設定する必要があります。 ビュー・オブジェクトの問合せを編集し、バインディング・スタイルとしてJDBC Positionalを選択します。 View Objectウィザードを使用して個々のビュー・オブジェクトを作成する場合は、ステップ5のQueryでバインディング・スタイルを選択します。

データベース依存でないSQLをハンド・コーディングする
エキスパート・モードのビュー・オブジェクト、通常のエンティティベースのビュー・オブジェクトの Where句、またはSQL式から導出された計算属性には、ハンド・コーディングのSQLを追加することが必要になる場合があります。 SQLを実際に記述する場合は、そのアプリケーションの実行対象となる可能性がある他のデータベースでもそのSQLが動作することを確認します。 もっとも安全なのは、SQL92の構成を使用する方法です。

エンティティ・オブジェクト属性にRefresh on InsertまたはRefresh on Updateを選択しない
これらのオプションを選択するとOracle固有のSQLが生成されるため、使用しないでください。

実行時SQL生成の構成
アプリケーションを実行する前にシステム・プロパティを指定し、適切なスタイルのSQLが 実行時に生成されるようにする必要があります。 そのためには、システム・プロパティとして jbo.SQLBuilderに、 使用するデータベースに適した値を設定します。次の表を参照してください。
データベース jbo.SQLBuilderの値
SQL Server SQLServer
DB2 DB2
その他のデータベース(MySQL、Sybaseなど) SQL92
システム・プロパティは、オペレーティング・システムの環境変数またはJavaコマンドライン・オプショ ンとして指定できますが、次の手順でWebアプリケーション・フィルタを設定する方法をお薦めします。

1. サーブレット・コンテキスト・リスナー
アプリケーションに新しいクラスを作成し、jbo.SQLBuilderプロパティを適切なデータベースの値に設定 するコードを追加します。 次に示すのは、SQL Serverの場合の例です。
                                   
package myproject.common; // Substitute your package name
                                    

import java.security.AccessController;
import java.security.PrivilegedAction;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import oracle.jbo.common.PropertyMetadata;

public class InitializationListener implements ServletContextListener {
private ServletContext context = null;
public void contextInitialized(ServletContextEvent event) {
context = event.getServletContext();
AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
// Set the SQL Builder to the correct value for your database, SQL Server in this example.
System.setProperty(PropertyMetadata.PN_SQLBUILDERIMPL.getName(), "SQLServer");
return null;
}
});
}
public void contextDestroyed(ServletContextEvent event) {
context = event.getServletContext();
}
}


2.
Webアプリケーション・フィルタの設 定
アプリケーションのweb.xmlファイルを編集し、使用するサーブレッ ト・コンテキスト・リスナー・クラスを含む<listener>タグを追加します。 こうすることで、アプリケーションを起動するたびに、指定したリスナーが実行されます。
                                   
<listener>
                                    
<listener-class>myproject.common.InitializationListener</listener-class>
</listener>

注:アプリケー ション・モジュールの構成にはjbo.SQLBuilderプロパティがありますが、このプロパティを設定しても影響はありません。 この問題について説明した 関 連するrelease noteを参照してください。
    受動化の構成
    アプリケーション・モジュールを受動化している間、Oracle ADF Business Componentsのランタイムにより永続性マネージャが使用され、アプリケーション・モジュールの状態のスナップショットがデータベースに書き込まれ ます。 アプリケーション・モジュールの受動化を正しく動作させるには、適切な永続性マネージャをアプリケーションで使用する必要があります。 アプリケーションをデータベースに対して受動化する必要はありません。 ファイルベースの受動化を選択することもできますが、クラスタ環境では動作しないため、通常、本番のアプリケーションでは推奨されません。 Oracle ADF BCの状態管理に精通していない場合は、『 Understanding Application Module Pooling Concept and Configuration Parameters』を参照し てください。

    データベース 受動化の構成方法
    SQL Server アプリケーション・モジュールの構成を編集し、 jbo.pcoll.mgrプロパティを oracle.jbo.pcoll.pmgr.SQLServerPersistManagerに設定します。下の注1を参照してください。
    DB2 設定は不要です。 適切な永続性マネージャが自動的に選択されます
    その他のデータベース(MySQL、Sybaseなど) オプション1、 推奨: カスタム永続性マネージャを実装し、jbo.pcoll.mgrプロパティをその永続性マネージャに設定します。下の注2を参照してください。
    オプション2: 何も設定しません。この場合は、ファイルベースの受動化が使用されます。

    注1: アプリケーション・モジュールの構成を編集してjbo.pcoll.mgrプロパティを変更する方法
    1. アプリケーション・ナビゲータで、目的のアプリケーション・モジュールを右クリックして「 Configurations...」 を選択します。
    2. Manage Configurationsダイアログで、実行時に使用する構成を選択して「 Edit」をクリックします。 複数の構成を使用する場合、またはどの構成を使用するか分からない場合は、リスト内の各構成を編集できます。
    3. Edit Business Components Configurationダイアログで「 Properties」タブを 選択します。
    4. jbo.pcoll.mgrプロパティの値を、正しい永続性マネージャの完全修飾クラス名に変更します。
    注2: カスタム永続性マネージャを実装する方法
    カスタム永続性マネージャを実装するには、インタフェース oracle.jbo.pcoll.PersistManagerを実装する必要があります。作業を短縮する場合は、 SQLServerPersistManager.javaを スターター・クラスとして使用できます。 このファイルを保存して名前(およびクラス名)を変更し、コードに含まれるすべてのSQL文がデータベースで動作するように変更します。
    永続性マネージャを作成した後、アプリケーション・モジュールの構成を編集し、 jbo.pcoll.mgrプロパティの値をカスタム永続性マネージャの完全修飾クラス名に変更します。編集方法が分からない場合は、前述の注1を参照し てください。

    詳細情報