この章の内容は次のとおりです。
データ・コントロールは、ADFモデルによって提供される抽象化です。データ・コントロールを使用して、データとビジネス・サービスを宣言的に操作し、UIコンポーネントを容易に作成できます。データ・コントロールの一般情報については、「ADFモデルについて」を参照してください。
Beanデータ・コントロール・タイプを使用して、プレーンJavaオブジェクト(POJO)とJPAベースのJavaサービス・ファサード・クラスを作成します。
EJBデータ・コントロールと同様に、JPAベースのBeanデータ・コントロールを使用して持続データを処理できます。これらのデータ・コントロールは、JPAエンティティ・クラスにアクセッサ・メソッドを提供するPOJOサービス・ファサード・クラスに基づいています。JPAベースのBeanデータ・コントロールの主な違いは、EJBコンテナに依存できず、永続性を管理するためのコードをユーザーが提供する必要があることです。EJBデータ・コントロールの詳細は、「EJBデータ・コントロールについて」を参照してください。
JPA機能を使用しないJavaクラスのBeanデータ・コントロールを作成することもできます。これらのデータ・コントロールは、永続性機能や名前付き基準のサポートを提供しませんが、たとえば属性に対する宣言的検証ルールの追加や、UIヒントのサポートなど、アダプタ・データ・コントロールのその他の機能は備えています。
JPAベースのBeanデータ・コントロールとは異なり、非JPAデータ・コントロールにはトランザクションの処理やデータソースの更新の実装が組み込まれていません。ただし、データ・コントロールによって認識されるシグネチャを持つ特定のメソッド内で、その機能のユーザー独自の実装をBeanクラスにコーディングできます。詳細は、「非JPA Beanデータ・コントロールへのトランザクション動作の追加」、および「Beanデータ・コントロールのカスタムCRUD操作の有効化」を参照してください。
非JPAデータ・コントロールは、スクロール可能ページングと範囲ページングをサポートしていますが、多少の手動コーディングを必要とします。詳細は、「データ・コントロールでページ分割サポートを手動で実装する方法」を参照してください。
Beanデータ・コントロールを拡張するカスタム・データ・コントロール・タイプを作成することもできます。詳細は、「カスタムBeanデータ・コントロールの作成」を参照してください。
データ・コントロールを実装する前に、他のADFおよびJDeveloperの機能を理解しておくと役に立つことがあります。次に、役に立つ可能性のある他のセクションへのリンクを示します。
一般的なデータ・コントロール機能: EJBデータ・コントロールを使用する前に、広範なデータ・コントロールの概念を理解することが重要です。詳細は、「ADFデータ・コントロールの使用」を参照してください。
ADFモデルとデータ・バインディング: ADF Webアプリケーション内でフォームを作成する場合は、ADFモデルおよびデータ・バインディングを使用します。詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の「Fusion WebアプリケーションでのADFモデルの使用」およびOracle ADFモデルJava APIリファレンスを参照してください。
ADF Faces: データバインドされたUIコンポーネントを作成する際に、ADF Facesコンポーネント・セットからのコンポーネントを使用する場合があります。詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の「データバインドされたWebユーザー・インタフェースの作成」を参照してください。
ADFタスク・フロー: タスク・フローは、JSFページ・フローを拡張して、トランザクション対応のモジュラ・アプローチによるナビゲーションおよびアプリケーション・コントロールを実現します。詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の「ADFタスク・フローの作成」を参照してください。
Beanデータ・コントロールは、Beanクラスのメタデータ・ラッパーとして機能し、データ・コントロール・オブジェクトとしてBeanのコード要素を公開します。このオブジェクトを使用して、これらのコード要素をUIコンポーネントにバインドできます。
Beanデータ・コントロールは、EJBデータ・コントロールと同じJava型およびコンストラクトをサポートします。詳細は、「EJBデータ・コントロールでサポートされる型とコンストラクト」を参照してください。
Beanに基づいてデータ・コントロールを作成すると、データ・コントロールによって数種類のオブジェクトが公開され、それぞれのオブジェクトを各種UIコンポーネントにバインドできます。Beanデータ・コントロールは、EJBデータ・コントロールと同じタイプのオブジェクトを公開します。詳細は、「EJBデータ・コントロール・オブジェクト」を参照してください。
Beanデータ・コントロールは、JavaBeans仕様を満たすクラスを基礎としています。たとえば、クラスが有効なデータ・コントロール・ソースであるためには、publicデフォルト・コンストラクタが必要です。
JPAベースのデータ・コントロールの全機能を活用するには、データ・コントロールによってサービスの構造を表現するために使用できるいくつかの要素をクラスに組み込む必要があります。これらの要素は、EJBデータ・コントロールのものとほとんど同じです。主な違いは、EJBセッションBeanのかわりに、Beanデータ・コントロールのJavaサービス・ファサード・クラスを使用することです。詳細は、「EJBデータ・コントロールの前提条件と考慮事項」を参照してください。
Javaエンティティ・クラスにアクセスするためのサービス・メソッドを含むPOJOクラスに基づいて、Beanデータ・コントロールを作成できます。JDeveloperに備わっているウィザードが、データ・コントロールの操作に必要なすべてのメソッドを含むファサード・クラスの作成に役立ちます。
始める前に:
サービス・ファサードとデータ・コントロールが準拠するコード規則について、全般的に理解しておくと役に立つ場合があります。詳細は、「データ・コントロールによって公開するBeanの準備」を参照してください。
アプリケーションでデータ・コントロールに対して使用することが必要になる可能性がある一般的なデータ・コントロール機能を理解しておくと役に立つこともあります。詳細は、「Beanデータ・コントロールの追加機能」を参照してください。
『Oracle JDeveloperによるアプリケーションの開発』のJPAエンティティを作成する方法に関する項で説明されているとおり、JPAエンティティを使用するプロジェクトを含むアプリケーション・ワークスペースを作成する必要があります。
JPAベースのBeanデータ・コントロールのサービス・ファサードを作成する手順は次のとおりです。
Beanの準備ができたら、JDeveloperを使用してデータ・コントロールを作成でき、これらのデータ・コントロールにより、Beanのサービス、およびデータ・コントロールによって提供される組込み操作にUIコンポーネントを宣言的にバインドするために必要なオブジェクトが提供されます。
JPAベースのBeanデータ・コントロールは、「新規ギャラリ」ウィンドウまたは「アプリケーション」ウィンドウから作成します。
始める前に:
Beanデータ・コントロールの一般的な知識があると役立ちます。詳細は、「Beanデータ・コントロールによるJavaコレクションとメソッドの公開」を参照してください。
アプリケーションでデータ・コントロールに対して使用することが必要になる可能性がある一般的なデータ・コントロール機能を理解しておくと役に立つこともあります。詳細は、「Beanデータ・コントロールの追加機能」を参照してください。
データ・コントロールが使用する、Bean内のコード・パターンとコンストラクトについて理解しておくと役に立つこともあります。詳細は、「データ・コントロールによって公開するBeanの準備」を参照してください。
また、「JPAベースのBeanデータ・コントロールのサービス・ファサードを作成する方法」で説明しているように、Javaサービス・ファサード・クラスを作成する必要があります。
Beanデータ・コントロールを作成する手順は次のとおりです。
Beanデータ・コントロールは、「新規ギャラリ」ウィンドウまたは「アプリケーション」ウィンドウから作成します。
始める前に:
Beanデータ・コントロールの一般的な知識があると役立ちます。詳細は、「Beanデータ・コントロールによるJavaコレクションとメソッドの公開」を参照してください。
アプリケーションでデータ・コントロールに対して使用することが必要になる可能性がある一般的なデータ・コントロール機能を理解しておくと役に立つこともあります。詳細は、「Beanデータ・コントロールの追加機能」を参照してください。
データ・コントロールが使用する、Bean内のコード・パターンとコンストラクトについて理解しておくと役に立つこともあります。詳細は、「データ・コントロールによって公開するBeanの準備」を参照してください。
次のタスクを完了する必要があります。
アプリケーション・ワークスペースとプロジェクトを作成します。詳細は、『Oracle JDeveloperによるアプリケーションの開発』のアプリケーションとプロジェクトの作成に関する項を参照してください。
プロジェクトにBeanクラスを作成します。詳細は、『Oracle JDeveloperによるアプリケーションの開発』の新規Javaクラスまたはインタフェースを作成する方法に関する項を参照してください。
非JPA Beanデータ・コントロールを作成する手順は次のとおりです。
JavaBeansコンポーネントに基づくデータ・コントロールを作成する際に、JDeveloperは次の処理を行います。
データ・コントロール定義ファイル(DataControls.dcx
)を作成し、概要エディタでファイルを開きます。
「データ・コントロール」パネルに、作成されたデータ・コントロール・オブジェクトの階層を表示します。
ADFデータ・コントロール機能ページでいずれかの機能を選択した場合は、これらの機能を実装するメソッドをセッションBeanに追加します。
概要エディタおよび「データ・コントロール」パネルの一般的な情報は、「データ・コントロール作成時のプロジェクト内の処理」を参照してください。JPAベースのデータ・コントロールに固有の情報は、「EJBおよびBeanデータ・コントロールのIDEでの表示」を参照してください。
ADFデータ・コントロール機能ページでいずれかの機能を選択した場合は、これらの機能を実装するメソッドがBeanに(ラッパー・クラスの生成を選択した場合は、ラッパー・クラスに)追加されます。
コレクションの問合せを行うアクセッサ・メソッドがBeanに存在し、ウィザードで「名前付き基準のサポート」を選択した場合は、oracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler
を使用するデータ・コントロールが生成されます。これは、宣言的名前付き基準とページ分割された問合せのサポートをデータ・コントロールに提供します。
コレクションの問合せを行うアクセッサ・メソッドがBeanに存在しない場合は、oracle.adf.model.adapter.bean.DataFilterHandler
を使用するデータ・コントロールが生成されます。名前付き基準をサポートしないほか、oracle.adf.model.adapter.bean.DataFilterHandler
にはページ分割機能が完全には実装されていません。ただし、ページ分割を実装するメソッドをBeanに追加できます。詳細は、「データ・コントロールでページ分割サポートを手動で実装する方法」を参照してください。
非JPA Beanを作成する場合であっても、@Id
アノテーションを使用してフィールドに主キー列のマークを付けることができます。
ただし、パフォーマンス上の理由から、JPAランタイム・ライブラリへの依存性が生じないように、データ・コントロール・レベルで主キーを指定したほうが望ましい場合があります。詳細は、「主キーとして属性を指定する方法」を参照してください。
Beanデータ・コントロールを作成するときには、ウィザードの「アクセス・モード」ドロップダウン・リストを使用して、データベースからレコードにどのようにアクセスするか、また同時にメモリーに保持されるレコードの数を制限するかどうかを決定できます。
Beanデータ・コントロールのページ分割サポートは、一般にEJBデータ・コントロールのページ分割と同じプリンシパルに従います。詳細は、「EJBデータ・コントロールでのデータのページ分割されたフェッチ」を参照してください。ただし、特に非JPAベースのデータ・コントロール場合、実装の一部を自分で提供しようと思う、または提供する必要がある場合があります。
非JPAデータ・コントロール(または、oracle.adf.model.adapter.bean.jpa.DataFilterHandler
ハンドラを使用する任意のEJBまたはBeanデータ・コントロール)では、ADFモデル・ランタイムによってスクロール可能ページングおよび範囲ページングを実装するには、セッション・ファサードまたはサービス・ファサードで、各コレクションにメソッドを3つずつ追加する必要があります。メソッド・シグネチャは、次のような形式となります。
List<EntityBeanName
> getEntityBeanName
List() List<EntityBeanName
> getEntityBeanName
List(int firstResult, int maxResults) long getEntityBeanName
ListSize()
注意:
JPAベースのデータ・コントロールは、一般にoracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler
ハンドラを使用するので、これらのメソッドを手動で実装する必要はありません。ただし、ベースとなるBeanがqueryByRange(String jpqlStmt, int firstResult, int maxResults)
メソッドを含んでいない場合は、oracle.adf.model.adapter.bean.jpa.DataFilterHandler
ハンドラがデータ・コントロールに割り当てられる可能性があります。詳細は、「推奨されるセッション・ファサードの要素」を参照してください。
問合せとページングの組込みオプションがアプリケーションに不十分な場合は、データ・コントロールに独自のデータ・ハンドラ・クラスを指定することによって、問合せとページングのカスタム動作を実装できます。
始める前に:
Beanデータ・コントロールの一般的な知識があると役立ちます。詳細は、「Beanデータ・コントロールによるJavaコレクションとメソッドの公開」を参照してください。
アプリケーションでデータ・コントロールに対して使用することが必要になる可能性がある一般的なデータ・コントロール機能を理解しておくと役に立つこともあります。詳細は、「Beanデータ・コントロールの追加機能」を参照してください。
データ・コントロールが使用する、Bean内のコード・パターンとコンストラクトについて理解しておくと役に立つこともあります。詳細は、「データ・コントロールによって公開するBeanの準備」を参照してください。
Beanデータ・コントロールまたはEJBデータ・コントロールを作成する必要があります。詳細は、「JPAベースのBeanデータ・コントロールを作成する方法」、「非JPAベースのBeanデータ・コントロールを作成する方法」および「EJBデータ・コントロールを作成する方法」を参照してください。
注意:
データ・コントロールを作成する際、どのアクセス・モードを選択するかは重要ではありません。次の手順で、そのアクセス・モードを手動でオーバーロードします。
問合せおよびページ分割にカスタム・ハンドラを実装する手順は次のとおりです。
Beanデータ・コントロールの状態をADFランタイムによって管理するように構成できます。この構成は、高可用性環境やクラスタ環境でアプリケーションを実行する場合に特に役立ちます。障害が発生したサーバー・ノード上でアプリケーションを実行している場合は、データ・コントロールのセッション状態の最新スナップショットをクラスタ内の別のノードにリストアできます。同様に、ユーザーのセッションが中断された場合は、フェイルオーバー・サポートを使用して、セッションが再開されたときにデータ・コントロールの状態をリストアできます。
フェイルオーバーを有効にするには、データ・コントロールの状態を保存およびリストアするためのメソッドを実装します。ADFモデル・ランタイムは、これらのメソッドの呼出しを管理し、データ・コントロールの状態の配布に関する詳細を処理します。EJBおよびBeanデータ・コントロールのフェイルオーバーのサポートには、次の3つのメソッドが必要です。これらのメソッドは、データ・コントロール・ウィザードを使用して、または手動でBeanクラスに追加できます。
public Serializable createSnapshot()
。データ・コントロール、および基礎となるBeanの状態をシリアライズ・オブジェクトとして保存し、そのオブジェクトのハンドルを返します。ADFランタイムは、データ・コントロールによってバインドされたコンポーネントに対してユーザーが変更を実行するたびに(または、ユーザーが単にページをリフレッシュしたときに)、このメソッドを呼び出します。
このメソッドには、保存される対象を決定し、対応するSerializable
ハンドルを返すロジックを追加する必要があります。
public void restoreSnapshot(Serializable handle)
。最も新しく作成されたスナップショットに基づいて、セッション状態をリストアします。このメソッドは、接続の切断、サーバー障害など、なんらかの理由によって中断されたセッションをADFモデル・ランタイムがリストアする必要があるときに呼び出されます。
このメソッドでは、createSnapshot()
によって返されるハンドルからデータ・コントロールをリストアするための実装をユーザーが提供する必要があります。
public void removeSnapshot(Serializable handle)
。createSnapshot()
メソッドによって返されるハンドルに関連したスナップショットを削除します。
JPAベースのデータ・コントロールは、JPAのCRUD (作成/読取り/更新/削除)サポートと緊密に統合されています。たとえば、Create
やDelete
などの組込みデータ・コントロール操作は、実行時に呼び出されると、対応するJPA永続化メソッドを使用してこれらの操作を実行します。
ただし、データ・コントロールがJPAベースでない場合は、ユーザー独自の実装を提供してBeanのCRUDモデルをデータ・コントロールと統合できます。
「Beanデータ・コントロールの作成」ウィザードを使用してBeanデータ・コントロールを作成し、カスタムCRUDサポートを有効にするときに、Beanデータ・コントロール・クラスに追加されるメソッド・スタブを次に示します。
public Object createRowData(RowContext p0)
。新しいデータの行を作成するために使用されます。実行時に、Create
操作が呼び出されるとこのメソッドが呼び出されます。このメソッドのユーザー独自の実装を提供することにより、新規行をどのように永続化するかカスタマイズできます。
public boolean removeRowData(RowContext p0)
。データの行を削除するために使用されます。実行時に、Delete
操作が呼び出されるとこのメソッドがコールされます。
public boolean setAttributeValue(oracle.binding.AttributeContext p0, Object p1)
。このメソッドは、Bean内の属性に新しい値が設定されるときに、ADFモデル・ランタイムによってコールされます。
public Object registerDataProvider(oracle.binding.RowContext p0)
。このメソッドは、オブジェクトが変更されるか削除のマークが付けられる前にデータ・バインディング機能によってコールされるため、データ・コントロールによって行に未検証のマークが付けられる可能性があります。
カスタムCRUD機能を実装する場合にはこのメソッドが存在している必要がありますが、通常はユーザー独自の実装を提供する必要はありません。
public void validate()
。未検証の場合にトランザクションを検証します。
カスタムCRUD機能を実装する場合にはこのメソッドが存在している必要がありますが、通常はこのメソッドのユーザー独自の実装を提供する必要はありません。
非JPAデータ・コントロールの作成については、「非JPAベースのBeanデータ・コントロールを作成する方法」を参照してください。
「Javaサービス・ファサードの作成」ウィザードを使用してJPAベースのBeanを作成する際に、明示的なコミット・モデルをサポートするコードを生成できます。データ・コントロールがこのようなクラスに基づいている場合、Beanのトランザクション・メソッドはデータ・コントロール内でCommit
操作およびRollback
操作として公開されます。
非JPA Beanデータ・コントロールの場合は、Commit
操作とRollback
操作をサポートするデータ・コントロールを作成する際に、スタブ・メソッドを生成できます。これらのスタブ・メソッド内で、トランザクション動作のユーザー独自の実装を作成できます。実行時に、Commit
操作とRollback
操作が呼び出されると、これらのメソッドが呼び出されます。
「Beanデータ・コントロールの作成」ウィザードを使用してBeanデータ・コントロールを作成し、トランザクション・サポートを有効にするときに、Beanデータ・コントロール・クラスに追加されるメソッド・スタブを次に示します。
public boolean isTransactionDirty()
。コミット(またはロールバック)される保留中の変更があるかどうかのマーク付けに使用されます。
public void commitTransaction()
。保留中の変更をすべてデータソースにコミットします。
public void rollbackTransaction()
。保留中の変更をロールバックします。
注意:
非JPAデータ・コントロールにトランザクション・サポートを実装するためには、カスタムCRUDメソッドも実装する必要があります。詳細は、「Beanデータ・コントロールのカスタムCRUD操作の有効化」を参照してください
非JPAデータ・コントロールの作成については、「非JPAベースのBeanデータ・コントロールを作成する方法」を参照してください。
Adapter Data Control Frameworkは、BeanおよびEJBデータ・コントロールのメタデータを指定するために使用できるJavaアノテーションをいくつか提供しています。
oracle.adf.model.adapter.bean.annotation.AttributeHint
、oracle.adf.model.adapter.bean.annotation.DateFormatter
およびoracle.adf.model.adapter.bean.annotation.Formatter
。データ・コントロールのUIヒントを提供するために使用します。XMLデータ・コントロール構造ファイルを作成する必要はありません。詳細は、「アノテーションを使用した属性のUIヒントの提供」を参照してください。
oracle.adf.model.adapter.bean.annotation.AccessMode
。DataControls.dcx
ファイルのAccessMode
フラグをオーバーライドするために使用します。このアノテーションを使用して、アクセッサ・メソッドのレベルでJPAベースのデータ・コントロールのページング機能を制御できます。これにより、単一のデータ・コントロール内で異なるアクセス・モードを使用することが可能になります。
// AccessModeType can be either NO_PAGING, RANGE_PAGING or SCROLLABLE)@AccessMode(type = AcessModeType.RANGE_PAGING) public Collection<EmpBean> getListEmpBean() {} public Collection<EmpBean> getListEmpBean(int firstResult, int maxResults) {} public int getListEmpBeanSize() {} }
詳細は、「データ・コントロールで個別オブジェクトにアクセス・モードを指定する方法」を参照してください。
oracle.adf.model.adapter.bean.annotation.AccessModeType
。クラス内でoracle.adf.model.adapter.bean.annotation.AccessMode
アノテーションを使用する場合に、これもインポートする必要があります。
oracle.adf.model.adapter.bean.annotation.Property
。属性のカスタム・プロパティを定義するために使用します。次に例を示します。
@Property(name = "myProp1", value = "myProp1Value") public Long getEmpno() {}
oracle.adf.model.adapter.bean.annotation.Properties
。属性の複数のプロパティを指定するために使用します。次に例を示します。
@Properties( { @Property(name = "myProp1", value = "myProp1Value"), @Property(name = "myProp2", value = "myProp2Value"), }) public Long getEmpno() {}
oracle.adf.model.adapter.bean.annotation.ElementType
。コレクションのタイプを定義するために使用します。たとえば、要素タイプEmpBean
は、@ElementType(name = "model.EmpBean"
によって定義できます。これは、汎用コレクション(たとえば、Collection<EmpBean>
)を使用するかわりとなり、JDK 1.4以前を使用する場合、またはコレクションの要素タイプをオーバーライドする必要がある場合にのみお薦めします。
@ElementType(name = "model.EmpBean") public Collection getListEmpBean() {}
oracle.adf.model.adapter.bean.annotation.Id
。属性の主キーを定義するために使用します。次に例を示します。
@Id public int getPrimaryKey() {}
このアノテーションは、javax.persistence.Id
アノテーションを使用するエンティティ・クラスを含むJPAベースのデータ・コントロールには使用しないでください。
Beanデータ・コントロール・タイプの定義と実装クラスを拡張して、カスタム・データ・コントロールを作成することによって、Beanデータ・コントロール・タイプの機能を変更または拡張できます。
カスタムBeanベースのデータ・コントロールの作成は、次の主なステップを組み合せて行います。
(オプション)データ・コントロールがフィルタリング、フェイルオーバー、データソースの更新などのデータ・コントロール機能を処理する方法をカスタマイズするために、oracle.adf.model.adapter.bean.BeanDataControl
を拡張します。
(オプション)新規の実装クラスを作成するために、oracle.adf.model.adapter.bean.BeanDCDefinition
を拡張します。
新規の実装クラスを作成する場合は、その実装クラスをDataControls.dcx
ファイル内で登録する必要があります。ファイルのソース・ビュー内で、データ・コントロールのImplDef
プロパティ(oracle.adf.model.adapter.bean.BeanDataControl
)の値を、新しい実装クラスの完全修飾名に置き換えます。
(オプション)データ・コントロールによって表現されるデータ構造のタイプに対して、新しい構造定義タイプを作成します。
(オプション)データ・コントロールのDataControls.dcx
ファイルで提供されるメタデータを保持する構成クラスを定義します。たとえば、oracle.adf.model.adapter.bean.BeanDCConfiguration
を拡張できます。これは、標準のBeanデータ・コントロールに対する構成クラスです。
この場合、データ・コントロール実装クラスで、oracle.adf.model.adapter.AbstractDefinition
から継承されたgetConfiguration()
メソッドをオーバーライドし、その戻り値を新しい構成クラスにキャストする必要があります。
(オプション)データ・コントロール・クラス内で、サポートされる既存の機能(フェイルオーバーやカスタムCRUDサポートなど)のいくつかを実装します。
Beanデータ・コントロールとその他のデータ・コントロール・タイプによって使用されるクラスのAPIドキュメントについては、 Oracle ADFモデルJava APIリファレンスを参照してください。