3 EJBデータ・コントロールの作成および構成
この章の内容は次のとおりです。
EJBデータ・コントロールについて
データ・コントロールは、ADFモデルによって提供される抽象化です。データ・コントロールを使用して、データとビジネス・サービスを宣言的に操作し、UIコンポーネントを容易に作成できます。一般情報については、「ADFモデルについて」を参照してください。
EJBセッションBeanのデータ・コントロールを作成すれば、データベースからのデータへのアクセスなど、オブジェクト・モデル・データに依存するWebアプリケーションの作成が簡単になります。すべてのアダプタ・データ・コントロール(宣言的UIヒントや検証ルールなど)に共通の機能に加えて、EJBデータ・コントロールには次の機能が組み込まれています。
-
大規模なデータ・セットに対する問合せのパフォーマンスを向上させるための範囲ページング
-
例による検索フォームの作成を容易にする宣言的名前付き基準
-
トランザクション操作(セッションBeanのトランザクション・ビジネス・メソッドに基づく)
-
フェイルオーバー・サポート(ユーザーが実装するフェイルオーバー・メソッドに基づく)
EJBデータ・コントロールのユースケースと例
EJBデータ・コントロールを使用して、次のようなことを実行できます。
-
バインディング・コードを手動で作成せずに、EJBセッション・ファサードにバインドされた高機能Webページを作成する。
-
既存のEJBビジネス・サービスをADF機能(ADFモデル・データ・バインディング、ADF Faces、ADFタスク・フローなど)と統合するアプリケーションを作成する。
-
UIヒント、検証ルール、およびその他の宣言的メタデータを利用して、アプリケーション全体を通じて一貫したプロンプト、ツールチップ、フォーマット・マスク、およびエラー・メッセージを提供する。データ・コントロールへのビジネス・ロジックの追加の詳細は、「データ・コントロールへのビジネス・ロジックの追加」を参照してください。
-
ADFモデルの機能を利用して、例による問合せフォームと値リスト(LOV)コンポーネントをページに宣言的に追加する。LOVコンポーネントの作成の詳細は、「値オブジェクトのリストの作成」を参照してください。
-
アプリケーションのMDSカスタマイズを可能にする。これにより、ユーザーがソース・コードを変更することなくアプリケーションをカスタマイズできます。
EJBデータ・コントロールの追加機能
データ・コントロールを実装する前に、他のADFおよびJDeveloperの機能を理解しておくと役に立つことがあります。次に、役に立つ可能性のある他のセクションへのリンクを示します。
-
一般的なデータ・コントロール機能: EJBデータ・コントロールを使用する前に、広範なデータ・コントロールの概念を理解することが重要です。データ・コントロールの詳細は、「ADFデータ・コントロールの使用」を参照してください。
-
ADFモデルとデータ・バインディング: ADF Webアプリケーション内でフォームを作成する場合は、ADFモデルおよびデータ・バインディングを使用します。ADFモデルの詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』のFusion WebアプリケーションでのADFモデルの使用に関する項、およびOracle ADFモデルJava APIリファレンスを参照してください。
-
ADF Faces: データバインドされたUIコンポーネントを作成する際に、ADF Facesコンポーネント・セットからのコンポーネントを使用する場合があります。データバインドされたWebユーザー・インタフェースの詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の「データバインドされたWebユーザー・インタフェースの作成」を参照してください。
-
ADFタスク・フロー: タスク・フローは、JSFページ・フローを拡張して、トランザクション対応のモジュラ・アプローチによるナビゲーションおよびアプリケーション・コントロールを実現します。ADFタスク・フローの詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』のADFタスク・フローの作成に関する項を参照してください。
-
JDeveloperでのJava EEサポート: JDeveloperは、EJBデータ・コントロールで使用するために最適化されたJava EEコンポーネントの作成をサポートします。EJBおよびJPAコンポーネントの詳細は、『Oracle JDeveloperによるアプリケーションの開発』のEJBおよびJPAコンポーネントによる開発に関する項を参照してください。
データ・コントロールで使用するセッションBeanの準備
EJBデータ・コントロールは、EJBセッションBeanをカプセル化し、Beanのコード要素をデータ・コントロール・オブジェクトとして公開します。このオブジェクトを使用して、これらのコード要素をUIコンポーネントにバインドできます。EJBセッションBeanに基づいたデータ・コントロールを作成する場合、データ・コントロールはBeanのコーディング・パターンに依存します。この項では、特定のコード・パターンとデータ・コントロール・オブジェクトの間のマッピングを示し、データ・コントロールの機能を最大限に活用するためにBeanで使用できるパターンについて説明します。
注意:
データ・コントロールは、Beanコードを置き換えるものではありません。かわりに、Beanとバインディング・レイヤーの間のシン・アダプタ・レイヤーとして機能します。Bean内でコーディングしたメソッドが、そのまま実行時に使用されます。UIヒントや検証ルールなど、データ・コントロール内で指定した宣言的メタデータが、セッションBeanのビジネス・ロジックを補強します。同様に、データ・コントロールを作成した後にメソッドを追加または変更した場合、データ・コントロールはこれらの新しいメソッドまたは改訂したメソッドを使用して動作します。
EJBデータ・コントロールでサポートされる型とコンストラクト
EJB (およびBean)データ・コントロールは、次のJava型およびコンストラクトを使用するクラスと互換性があります。
-
Javaプリミティブ型および配列
-
複合Java型(ユーザー独自のBeanなど)
-
Javaスカラー型(
java.math
、java.sql
、およびjava.util
の各パッケージからの型など) -
java.util.Collection
、java.util.List
、およびjava.util.Map
の各パッケージに含まれるコレクション型 -
総称型、強い型指定のコレクション、およびワイルドカード
-
次のようなJava Persistence API (JPA)機能。
-
主キーを決定するための
@Id
アノテーション -
名前付き問合せのための
@NamedQuery
アノテーションと完全なJPQL構文 -
マスター詳細関係と値リスト(LOV)関係を指定する
@JoinColumn
アノテーション
-
EJBデータ・コントロール・オブジェクト
EJBセッションBean (またはPOJO Bean)に基づいてデータ・コントロールを作成すると、データ・コントロールによって数種類のオブジェクトが公開されます。これらのオブジェクトそれぞれを、各種のUIコンポーネントにバインドできます。
EJBデータ・コントロールおよびBeanデータ・コントロールの場合は、get
で始まるすべてのpublicメソッドから返されるコレクション、およびコレクションまたはget
メソッドから返される複合型とプリミティブに対して、データ・コントロール・オブジェクトが公開されます。このような場合、データ・コントロール・オブジェクトの名前は一般にget
メソッドの名前と一致しますが、先頭のget
が名前から削除されます。
返されるオブジェクトに、JoinColumn
アノテーションによって別のオブジェクトとの関係が定義されている場合、「データ・コントロール」パネルには子オブジェクトが表示されます。
public get
メソッドによってBeanのフィールドが公開されている場合は、コレクション属性または構造化属性の子属性としてこれらのフィールドが「データ・コントロール」パネルに公開されます。配列、およびプリミティブまたは文字列からなる単純なコレクションを返すget
メソッドの場合は、element
という名前の子属性ノードが「データ・コントロール」パネルに公開されます。
get
が前に付いていないメソッドの場合、これらのメソッドはメソッド・オブジェクトとして「データ・コントロール」パネルに公開されます。これらのメソッドの戻り値は、メソッド戻りオブジェクトとして公開されます。
また、これらのオブジェクトの多くに対して、組込みのデータ・コントロール操作が使用できるようになりました。これらの操作すべてのリストについては、「データ・コントロールの組込み操作」を参照してください。
注意:
EJBデータ・コントロールとBeanデータ・コントロールは、Beanコンストラクタも公開します。このコンストラクタを使用して、Beanの新規インスタンスを作成するためのボタンをUIで作成できます。データ・コントロールのCreate
操作を使用してインスタンスを作成するかわりに、この方法を使用できます。「データ・コントロール」パネルでコンストラクタ・ノードから作成されるボタンを使用すれば、ユーザーが新規オブジェクト・インスタンスを作成する際に、Create
操作の実行時に通常発生する永続性コンテキストにそのオブジェクトを追加する必要がありません。コンストラクタのバインディング・オブジェクトのresult
プロパティにバインドすることによって、そのオブジェクト・インスタンスに宣言的にアクセスできます。
表3-1は、各種のデータ・コントロール・オブジェクトとEJBクラスの要素の対応を示しています。これらのオブジェクトの使用については、「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」を参照してください。
表3-1 重要なEJBおよびBeanデータ・コントロール・オブジェクト
アイコン | 名前 | 説明 |
---|---|---|
![]() |
コレクション |
コレクション( コレクションの下の子は、コレクションの属性、関連したコレクション、コレクションから値を戻すカスタム・メソッド、またはコレクションに対して実行できる組込み操作などです。 |
![]() |
構造化属性 |
コレクションではない複合Java型を返すpublic |
![]() |
属性 |
Javaプリミティブまたは |
![]() |
キー属性 |
主キーとしてのマークが付けられた(または複合主キーの一部である)属性に対して公開されます。キー属性は、エンティティBeanクラス内、またはBeanのデータ・コントロール構造ファイル内で、 |
![]() |
メソッド |
|
![]() |
メソッド戻り |
メソッドまたはその他の操作から返されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。 メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッド戻りの下に子として表示されるオブジェクトは、コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、または親コレクションで実行できる操作などです。 |
![]() |
操作 |
親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、コレクションまたはメソッド戻り値の下の「操作」 ノードと、ルート・データ・コントロール・ノードの下にもあります。特定のコレクションまたはメソッド戻りの子である操作は、それらのオブジェクトにのみ作用し、データ・コントロール・ノードの下の操作は、そのデータ・コントロール内のすべてのオブジェクトに作用します。 1つ以上のパラメータが操作に必要な場合、それらのパラメータは操作の下の「パラメータ」ノードにリストされます。 |
![]() |
パラメータ |
メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」ノード内に表示されます。 |
![]() |
名前付き基準 |
ユーザー検索フォームを作成できるメタデータ・ベースの問合せを表します。 カスタム・ビュー基準を作成し、「データ・コントロール」パネルに追加できます。「名前付き基準を使用した結果セットのフィルタリング」を参照してください。 |
![]() |
コンストラクタ |
BeanまたはEJBデータ・コントロールに含まれる作成可能な型のいずれかのコンストラクタを表します。このデータ・コントロール・オブジェクトを使用して、コマンド・コントロールを作成できます。ユーザーがこれをクリックすると、その型の新規インスタンスを作成できます。 |
セッション・ファサード・パターンについて
EJBデータ・コントロールは、EJBセッション・ファサード設計パターンに基づいています。このパターンでは、セッションBeanが個々のエンティティBeanへのアクセスを仲介し、これらのBeanにはデータベース表の問合せを行うコードが含まれています。セッションBeanに基づくデータ・コントロールを作成すると、セッションBeanのメソッドに基づく最上位オブジェクトと、セッションBeanのアクセッサ・メソッドによって取得されたエンティティBean内の詳細に基づく下位オブジェクトが、データ・コントロールによって公開されます。
EJBデータ・コントロールの前提条件と考慮事項
EJBデータ・コントロールの全機能を活用するには、データ・コントロールによってサービスの構造を表現するために使用できるいくつかの要素をクラスに組み込む必要があります。
プロジェクトには、次のタイプのクラスが含まれている必要があります。
-
アプリケーションが問合せを行う必要があるすべてのデータベース表に対応するJPAエンティティ・クラス。
-
エンティティBeanへのアクセッサ・メソッド、およびその他のビジネス・メソッドを含む、1つ以上のセッションBean。EJBデータ・コントロールは、セッションBeanに基づいています。
-
オプションで、セッションBeanの構造を反映した(POJO)サービス・ファサード・クラス。これらのサービス・ファサード・クラスを使用すれば、アプリケーション・サーバー・コンテナ内でこれらのサービスを実行する必要がないので、サービスのテストに便利です。サービスをデータ・コントロールに対してテストするために、サービス・ファサード・クラスのデータ・コントロールを作成することもできます。
推奨されるエンティティBeanの要素
エンティティBeanには次の要素が含まれている必要があります。
-
コレクションの各行を返す問合せを含む
@NamedQuery
アノテーション。Java Persistence Query Language (JPQL)のコンストラクトを利用して、より高度な選択を行う問合せを追加することもできます。JPQLの詳細は、http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html
を参照してください。 -
外部キーによって他の表(または同じ表の他の列)を参照する列に対する
@JoinColumn
アノテーション。生成されるデータ・コントロールにより、これらの結合された列がマスター/ディテール関係として公開され、これらの関係に依存するUIコンポーネントの作成が容易になります。 -
エンティティBeanによって表現されるコレクションそれぞれの
add
EntityBeanName(CollectionType collectionParam)
メソッド、およびremove
EntityBeanName(CollectionType collectionParam)
メソッド。データ・コントロールのCreate
操作とDelete
操作は、コレクション内の行を追加および削除するために、これらのメソッドに依存します。 -
エンティティBeanごとに指定された主キー。これは、実行時に新規行を作成する際に
Create
操作が正しく動作するために必要です。該当する列に対して
@Id
アノテーションを追加(または生成)することによって、エンティティBean内で主キー列を指定できます。 -
新規レコードを作成する際に主キー値を生成するための方式。これは特に、明示的なコミット・モデルを使用している場合には重要です。この場合、新規レコードは作成時に永続化しておく必要がありますが、ユーザーが他のフィールドの詳細を入力する前に行う必要があります。主キー値の生成の詳細は、「@GeneratedValueアノテーションを使用した主キーのIDの生成について」を参照してください。
推奨されるセッション・ファサードの要素
データ・コントロール機能との統合のために、セッションBean (またはJavaサービス・ファサード・クラス、あるいはその両方)には次のリストに示す要素を含めることをお薦めします。JDeveloperのウィザードを使用してクラスを作成する場合は、これらの要素がデフォルトで自動的に生成されます。
-
エンティティBeanに指定された名前付き問合せの結果を返すgetterメソッド。たとえば、次の例に示すメソッドは、
Customer.findById
という名前付き問合せの結果を返します。/** <code>select o from Customer o where o.id = :custId</code> */ public List<Customer> getCustomerFindById(BigDecimal custId) { if (custId != null) { Long custIdLong = new Long(String.valueOf(custId)); return em.createNamedQuery("Customer.findById").setParameter("custId", custIdLong).getResultList(); } else { return getCustomerFindAll(); }
名前付きパラメータを含む問合せを作成する際に、その問合せに対して作成されるデータ・コントロール・オブジェクトには
ExecuteWithParams
組込み操作が含まれます。この操作を使用して、実行時に指定されるパラメータに基づいたフォームを素早く作成できます。ヒント:
エンティティBeanに対して複数の名前付き問合せを使用する場合は、それぞれの名前付き問合せに対してgetterメソッドを作成して、問合せごとに別個のデータ・コントロール・オブジェクトを作成できます。
-
JPA名前付き問合せ、名前付き基準メタデータ、スクロール可能アクセス・モード、および範囲ページング・アクセス・モードの組込みサポートを利用するための
queryByRange(String jpqlStmt, int firstResult, int maxResults)
メソッド。データ・コントロールは、このメソッドを使用してすべての名前付き問合せを実行します(セッションBean内で問合せのためにgetterメソッドを呼び出すかわりに)。次の例は、JDeveloperを使用してセッションBeanを生成する(またはJavaサービス・ファサード・ウィザードを使用してプレーンJavaファサードを生成する)際に、
queryByRange(String jpqlStmt, int firstResult, int maxResults)
メソッドに対して生成されるコードを示しています。public Object queryByRange(String jpqlStmt, int firstResult, int maxResults) { Query query = em.createQuery(jpqlStmt); if (firstResult > 0) { query = query.setFirstResult(firstResult); } if (maxResults > 0) { query = query.setMaxResults(maxResults); } return query.getResultList(); }
このメソッドの実装は変更できますが、シグネチャはADFモデル・ランタイムが検索するため、そのまま保持する必要があります。
-
(Beanがトランザクション動作を行う場合)次に示すとおりのシグネチャを持つ、次のメソッド。
-
public boolean isTransactionDirty()
-
public void rollbackTransaction()
-
public void commitTransaction()
これらのメソッドを使用して、データ・コントロールの
commit
操作とrollback
操作が実装されます。JDeveloperウィザードを使用してJavaサービス・ファサード・クラスとコンテナ管理のEJBステートフル・セッションBeanを作成する場合は、デフォルトでこれら3つのメソッドの作業用実装がクラスに生成されます。 -
JDeveloperでのデータ・コントロール用EJBの作成
JDeveloperのウィザードを使用して、データ・コントロール用に最適化されたEJBエンティティ・クラスとセッションBeanを作成できます。EJBビジネス・サービス・レイヤーの使用の詳細は、『Oracle JDeveloperによるアプリケーションの開発』のEJBビジネス・サービス・レイヤーの使用方法に関する項を参照してください。
EJBおよびBeanデータ・コントロールがgetterメソッドを使用する方法に関する必知事項
セッションBeanでqueryByRange(String jpqlStmt, int firstResult, int maxResults)
を使用する(また、データ・コントロールがoracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler
ハンドラを使用する)場合、データ・コントローラはこのメソッドを使用してすべての名前付き問合せを実行します(セッションBean内で問合せのためにgetterメソッドを呼び出すかわりに)。getterメソッドに追加したカスタム・ロジックがある場合、問合せの実行時にカスタム・ロジックは呼び出されません。そのカスタム・ロジックを実行する必要がある場合は、queryByRange(String jpqlStmt, int firstResult, int maxResults)
メソッドに組み込むことができます。
セッションBeanにqueryByRange(String jpqlStmt, int firstResult, int maxResults)
を含めない場合、そのBeanに基づくデータ・コントロールはoracle.adf.model.adapter.bean.DataFilterHandler
ハンドラを使用して生成されます。この場合、データ・コントロールはセッションBeanのgetterメソッドを直接呼び出しますが、データ・コントロール内のオブジェクトに対して宣言的名前付き基準を使用することはできず、スクロール可能ページングと範囲ページングを機能させるためには、メソッドを手動で実装する必要があります。名前付き基準の使用の詳細は、「名前付き基準を使用した結果セットのフィルタリング」を参照してください。ページングの詳細は、「EJBデータ・コントロールでのデータのページ分割されたフェッチ」を参照してください。
EJBセッションBeanのコミット・モデルについて
EJBデータ・コントロールは、様々な種類のEJBセッションBeanに対して使用できます(Bean管理またはコンテナ管理のどちらか、ステートフルまたはステートレスのどちらかに関係なく)。JDeveloperの「セッションBean作成」ウィザードにより、次のタイプのセッションBeanのコードを生成でき、これらを使用してデータを更新するためのデータ・コントロールを作成できます。
-
暗黙的コミットを行うステートレス・コンテナ管理トランザクション(CMT)
-
暗黙的コミットを行うステートレスBean管理トランザクション(BMT)
-
暗黙的コミットを行うステートフルCMT
-
暗黙的コミットを行うステートフルBMT
-
明示的コミットを行うステートフルCMT
-
明示的コミットを行うステートフルBMT
暗黙的コミット・モデル
暗黙的コミットを行う種類のいずれかに基づくデータ・コントロールの場合、トランザクション操作Commit
およびRollback
は提供されません。これらのBeanでは、persistEntity
メソッドまたはmergeEntity
メソッドが使用されるたびに、基礎となるデータソースのデータが更新されます。
明示的コミット・モデル
明示的コミット・モデルを使用してBeanを処理する場合は、Commit
操作が呼び出されるまで、基礎となるデータソースは更新されません。これにより、複数の表で複数の行を作成または変更した後、1回のクリックでこれらすべてをデータソースにコミットできます。
明示的コミットを行う種類のいずれかに基づくデータ・コントロールの場合は、変更をコミットする前に、永続性コンテキストにその変更をマージまたは永続化するためのステップを追加する必要が生じることがあります。たとえば、新規行を永続化し、一連の変更をコミットするために、ユーザーがボタンをクリックすることが必要になる可能性があります。
ただし、一部のセッションBeanでは、呼出し時にCreate
操作によってエンティティの永続化メソッドが自動的に呼び出されるように、データ・コントロールを構成することが可能です。これは、JDeveloperの「セッションBean作成」ウィザードによって作成され、コンテナ管理のトランザクションと明示的コミット・モデルを使用してステートフルとして構成されたセッションBeanに対する、データ・コントロールのデフォルト動作です。新規行の自動永続化の詳細は、「新規行の自動永続化について」を参照してください。
新規行を作成時すぐに永続化できない場合は、マネージドBeanを使用して操作とメソッドをオーバーライドまたは結合できます。宣言メソッドのオーバーライド方法の詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』の宣言メソッドのオーバーライドに関する項を参照してください。
また、多くのBeanでは(特に、明示的コミットを行うステートフルCMT Beanの場合)、主キー列のID生成を実装する必要があります。主キー値のIDの生成の詳細は、「@GeneratedValueアノテーションを使用した主キーのIDの生成について」を参照してください。
@GeneratedValueアノテーションを使用した主キーのIDの生成について
一般に、エンティティの新規インスタンスを作成する際に、JPAによって主キー値が自動生成されるようにすると便利です。多くのデータ・モデルでは、ユーザーが新規行を永続化するときに制約違反エラーが発生しないように、表の主キー列に移入する値を生成する必要があります。単純な主キー・タイプ(Integer
、long
、String
など)を使用するJPAエンティティ・クラスでは、エンティティの主キー列に@GeneratedValue
アノテーションを使用して、新規レコードがその値を取得する方法と場所を指定できます。この場合は、これらの値がデータベースによって生成されるようにする必要があります。
JDeveloperの「エンティティ作成(表ベース)」ウィザードを使用して、エンティティの主キー値が自動的に生成され、割り当られるようにエンティティを構成できます。このオプションは、Integer
、String,
long
、int
など、単純な主キー・タイプを使用するエンティティに使用できます。このオプションを有効にすると、エンティティの主キー・フィールドに@GeneratedValue
のアノテーションが付けられます。これは、キー値を生成する方法を示しています。このウィザードでは、SequenceGenerator
とTableGenerator
のどちらかの方式を選択できます。
クラスに@GeneratedValue
アノテーションを付けた後は、新規行の作成時にデータベースによって値が生成され、エンティティに渡されるようにする必要があります。これを行うには、次のいずれかの方法を実行します。
-
eclipselink-ddl-generation
プロパティをcreate-tables
またはdrop-and-create-tables
に設定することにより、スキーマ・オブジェクトがデプロイメント時に自動的に作成されるように、エンティティの永続性ユニットを更新します。永続性ユニットのスキーマ生成動作の変更の詳細は、「永続性ユニットのスキーマ生成動作を変更する方法」を参照してください。 -
オンライン・データベース・スキーマを手動で更新して、
@GeneratedValue
アノテーションに指定されているID生成オブジェクトを組み込みます。JDeveloperの「エンティティ作成(表ベース)」ウィザードを使用する場合は、シーケンスまたは表ジェネレータのスキーマ・オブジェクトが作成され、「アプリケーション」ウィンドウ内でデータ・モデル・プロジェクトの「オフライン・データベース・ソース」ノードの下に表示されます。オブジェクトのノードを右クリックして、「生成」 > 「接続名」を選択し、続く「データベースからデータベース・オブジェクトを生成」ウィザードの手順を実行することによって、オブジェクトをオンライン・スキーマに追加できます。
-
ID生成オブジェクトがライブ・データベース・スキーマにすでに存在する場合は、これらのオブジェクトを参照するようにアノテーション属性を手動で変更します。たとえば、
@SequenceGenerator
アノテーションの場合は、sequenceName
属性を変更します。
永続性ユニットのスキーマ生成動作を変更する方法
デフォルトでは、「エンティティ作成(表ベース)」ウィザードを使用してエンティティを作成すると、eclipselink-ddl-generation
プロパティがデフォルト値(none
)を使用するように構成された状態で、永続性ユニットが作成されます。つまり、EclipseLink (生成されるエンティティのデフォルト永続性プロバイダ)は、データ定義言語(DDL)文またはスキーマ変更を実行時に生成しません。
ただし、アプリケーションを開発する際には、アプリケーションのテスト・デプロイを行うたびにデータベース・スキーマ内でスキーマ・オブジェクトが作成または再作成されるように、このプロパティを構成すると役に立つことがあります。これにより、データ・モデルを開発する際に行う漸進的な変更に合せてデータベース・スキーマの同期を手動で維持する必要がなくなります。たとえば、eclipselink-ddl-generation
プロパティをcreate-tables
に設定すると、EclipseLinkはエンティティによって指定された、まだスキーマに存在しないスキーマ・オブジェクトの生成を試みます(ID生成用のシーケンスと表など)。
永続性ユニットのスキーマ生成動作を変更する手順は次のとおりです。
- 「アプリケーション」ウィンドウで、データ・モデル・プロジェクトを展開し、永続性ユニット・ファイルをダブルクリックします(デフォルトでは、「アプリケーション・ソース」→META-INF→persistence.xmlにあります)。
- 複数の永続性ユニットが存在する場合は、永続性ユニット・ファイルの概要エディタで、プロジェクトの永続性ユニットを選択して「永続性ユニットに移動」アイコンをクリックします。
- 永続性ユニットの概要エディタで、「スキーマ生成」ページを選択します。
- 「生成タイプ」ドロップダウン・リストから、必要なスキーマ生成のタイプを選択します。
eclipselink-ddl-generation
オプションの詳細は、http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_ddl_generation.htm
にあるEclipseLinkのドキュメントを参照してください。
警告:
完成したアプリケーションを本番環境にデプロイする前に、データベース・スキーマをファイナライズし、eclipselink-ddl-generation
プロパティを再びnone
に変更する必要があります。
セッション・ファサードを自動的に更新する方法
エンティティBeanを変更する場合は、JDeveloperを使用して、セッションBeanおよび該当する場合はそのリモートおよびローカルのインタフェースを素早く更新できます。「セッション・ファサードの編集」ウィザードを使用して、エンティティ・クラスに追加された名前付き問合せとメソッドを公開するセッションBeanのコードを生成できます。セッションBeanに基づくデータ・コントロールがある場合は、「データ・コントロール」パネルをリフレッシュした直後に、新しく追加したメソッドがパネルで使用できるようになります。
更新されたエンティティBeanに基づいてセッション・ファサードを更新する手順は次のとおりです。
- 「アプリケーション」ウィンドウで、セッションBeanを右クリックして「セッション・ファサードの編集」を選択します。
- 「セッション・ファサード・オプションの指定」ダイアログで、セッションBean内で生成するメソッドをすべて選択します。
JPA問合せのリフレッシュに関する必知事項
デフォルトでは、JPA問合せを実行すると問合せの結果がキャッシュに入れられ、問合せが同じセッションから再発行されるとそのキャッシュが使用されます。このため、1人目のユーザーが最初の問合せを行った後、2人目のユーザーのセッションからデータベースの変更が行われた場合、1人目のユーザーが問合せを再実行すると(たとえば、ページをリフレッシュするなど)、2人目のユーザーが行った変更内容が反映されない可能性があります。
常にJPA問合せが新規に実行されるようにするには、問合せのヒントを使用してキャッシュをリフレッシュできます。
JPA 2.0では、問合せに次のようなヒントを適用できます。
setHint("javax.persistence.cache.storeMode", "REFRESH")
getCustomerFindAll()
メソッドの場合は、次のようになります。
public List<Customer> getCustomerFindAll() {
return em.createNamedQuery("Customer.findAll").
setHint("javax.persistence.cache.storeMode", "REFRESH").
getResultList();
}
JPA 1.0では、次のヒントを適用できます(TopLinkが永続性プロバイダであると仮定した場合)。
setHint("eclipselink.refresh", "true")
ADFデータ・コントロールを使用したセッションBeanサービスの公開
アプリケーションのサービスの準備ができたら、JDeveloperを使用して、UIコンポーネントとサービスとの宣言的バインドに必要な情報を提供するデータ・コントロールを作成できます。
標準Java EEアプリケーションでは通常、データベース内の表を表現するエンティティBeanを作成してから、すべてのEJBに対してセッション・ファサードを作成します。このファサードは、ベースとなるエンティティへの一元化されたインタフェースです。その後、通常は他のクラスを使用して、ユーザー・インタフェースと、セッション・ファサードによって公開されたサービスとの間での対話を調整します。
Oracle ADFアプリケーションでは、サービス・ファサードによって表現されるサービスをカプセル化し、レイヤー間の宣言的データ・バインディングを可能にするデータ・コントロールを作成することにより、プログラムによるモデル・レイヤーとビュー・レイヤー間の調整を不要にすることができます。その後、データ・コントロールによって、サービスに宣言的にバインドされるUIコンポーネントを作成します。バインディングは、データ・コントロールを参照するEL式の形で行われます。図3-1は、宣言的バインディングによって可能になるUIコンポーネントとデータ・コントロール・オブジェクトの間の調整を示しています。
データ・コントロールは、1つ以上のXMLメタデータ・ファイルで構成され、これらのファイルでは、実行時にバインディングと連動するサービスの機能が定義されます。データ・コントロールは、Beanの実装を変更することなく、基礎となるBeanと連動して動作します。
たとえば、図3-2は「アプリケーション」ウィンドウのEJBデータ・モデル・プロジェクトを示しています。プロジェクトには、Customer
Bean、Product
Bean、Order
Beanなど、データベース表を表現するいくつかのエンティティBeanが存在します。プロジェクトには、表から作成されたBeanへのアクセスに使用されるセッションBean OrdersSessionEJBBean
も含まれます。このセッションBeanには、レコードを永続化、マージ、および削除するためのサービス・メソッドも含まれます。セッションBeanに対してデータ・コントロールが存在します。開発者はこのデータ・コントロールを使用して、セッションBeanのメソッドとセッションBeanがカプセル化しているエンティティBeanに基づいて宣言的にUIページを作成できます。また、UIヒントや検証ルールなどの追加メタデータを含む、Customer
、Product
、およびOrder
の各Beanに対応するXMLファイルが、persdef.model
パッケージ内にあります。これらの追加XMLファイルは、特定のデータ・コレクションにメタデータを追加する場合のみ必要です。
図3-2 EJBモデル・プロジェクト
![この図は周囲のテキストで説明しています この図は周囲のテキストで説明しています](img/ejb_apps_window.png)
EJBデータ・コントロールを作成する方法
データ・コントロールは、「新規ギャラリ」ウィンドウ、または「アプリケーション」ウィンドウから作成できます。
始める前に:
EJBデータ・コントロールの一般的な使用法について理解しておくと役に立ちます。ADFデータ・コントロールを使用したセッションBeanサービスの公開の詳細は、「ADFデータ・コントロールを使用したセッションBeanサービスの公開」を参照してください。
アプリケーションでデータ・コントロールに対して使用することが必要になる可能性がある一般的なデータ・コントロール機能を理解しておくと役に立つこともあります。追加のデータ・コントロール機能の詳細は、「EJBデータ・コントロールの追加機能」を参照してください。
データ・コントロールが使用する、セッションBean内のコード・パターンとコンストラクトについて理解しておくと役に立つこともあります。データ・コントロールで使用するセッションBeanの準備の詳細は、「データ・コントロールで使用するセッションBeanの準備」を参照してください。
アプリケーション・ワークスペース、JPA/EJB 3.0エンティティ、およびエンティティ用に1つ以上のセッションBeanを作成する必要があります。EJBビジネス・サービス・レイヤーの使用の詳細は、『Oracle JDeveloperによるアプリケーションの開発』のEJBビジネス・サービス・レイヤーの使用方法に関する項を参照してください。
EJBデータ・コントロールを作成する手順は次のとおりです。
注意:
データ・コントロールの基礎となるBeanの名前を後に変更した場合、再度「データ・コントロールの作成」コマンドを使用して、データ・コントロールのメタデータを再生成する必要があります。この際には、同じデータ・コントロール・インスタンス名を保持できます。
データ・コントロールの作成後にBeanに単に変更を加えた場合は、データ・コントロールを再生成する必要はありません。Beanへの変更はデータ・コントロールに反映されます。ただし、基礎となるBeanの変更をデータ・コントロールに反映させるために、プロジェクトを一度閉じて再度開く必要がある場合があります。
EJBデータ・コントロール作成時のプロジェクトにおける処理内容
EJBセッションBeanに基づくデータ・コントロールを作成する際に、JDeveloperは次の処理を行います。
-
データ・コントロール定義ファイル(
DataControls.dcx
)を作成し、概要エディタでファイルを開きます。データ・コントロールの基礎となるBeanの構成、およびウィザードで選択したオプションに応じて、様々な要素とプロパティが
DataControls.dcx
ファイル内で構成され、ソース・ビューでこれらの内容を表示できます。これらの要素とプロパティには、次のようなものがあります。-
<CreatableTypes>
。ファサード・クラスに含まれるエンティティを指定し、これらに対して宣言的メタデータを作成できます。 -
DataControlHandler
。ページングや名前付き基準のサポートなど、データ・コントロールの様々な機能を実装するハンドラ・クラスを指定します。 -
AccessMode
。データ・コントロールが実行中のアプリケーション内のデータをフェッチする方法を決定します。データのページ分割されたフェッチの詳細は、「EJBデータ・コントロールでのデータのページ分割されたフェッチ」を参照してください。 -
EagerPersist
。新規行を作成時に永続性コンテキストに追加するかどうかを決定します。新規行の自動永続化の詳細は、「新規行の自動永続化について」を参照してください。
-
-
「データ・コントロール」パネルに、作成されたデータ・コントロール・オブジェクトの階層を表示します。
-
ADFデータ・コントロール機能ページでいずれかの機能を選択した場合は、これらの機能を実装するメソッドをセッションBeanに追加します。
-
「メタデータの生成」を選択した場合は、ハイレベル・データ・コントロール・オブジェクトのXMLデータ・コントロール構造ファイルが生成されます。これらのファイルは、特定のデータ・コントロール・オブジェクトに対して定義する、UIヒントや検証ルールなどの宣言的メタデータを保管しています。このオプションを選択しなかった場合は、
DataControls.dcx
概要エディタを使用してデータ・コントロール・オブジェクトに宣言的メタデータを追加するときに、データ・コントロール構造ファイルがオンデマンドで作成されます。データ・コントロールへのビジネス・ロジックの追加の詳細は、「データ・コントロールへのビジネス・ロジックの追加」を参照してください。
概要エディタおよび「データ・コントロール」パネルの一般的な情報は、「データ・コントロール作成時のプロジェクト内の処理」を参照してください。EJBおよびBeanデータ・コントロールに固有の情報は、「EJBおよびBeanデータ・コントロールのIDEでの表示」を参照してください。
EJBおよびBeanデータ・コントロールのIDEでの表示
EJBまたはBeanデータ・コントロールを作成した後、DataControls.dcx
ファイルに対して概要エディタを使用してデータ・コントロールをさらに詳細に構成でき、「データ・コントロール」パネルを使用してデータバインドされたUIコンポーネントを作成できます。
EJBおよびBeanデータ・コントロールのDataControls.dcx概要エディタ
DataControls.dcx
ファイルの概要エディタには、データ・モデルのマスター/ディテール階層のビューおよびセッション・ファサードのメソッドが表示されます。ノードを選択するとフィールドが表示され、これらのフィールドを「属性」タブの対応するエンティティ・クラス内のデータベース列にマッピングできます。「アクセッサ」タブでは、エンティティの関係が定義されている対応するエンティティ・クラスのフィールドが表示されます(たとえばOneToMany
およびManyToOne
)。コレクションの「操作」タブでは、コレクション・アクセッサの追加と削除のメソッドなど、データ・コントロールが標準操作に使用するエンティティ・メソッドを表示できます。
概要エディタおよび「データ・コントロール」パネルで使用されるアイコンの説明は、表2-1を参照してください。
データ・コントロールの設定を変更するには、要素を選択し、「編集」アイコンをクリックします。データ・コントロールの編集の詳細は、 「データ・コントロールへのビジネス・ロジックの追加」を参照してください。
EJBおよびBeanデータ・コントロールの「データ・コントロール」パネル
「データ・コントロール」パネルはパレットとして機能し、ノードを「データ・コントロール」パネルからWebページのデザイン・エディタにドラッグすることにより、データバインドされたUIコンポーネントを作成できます。「データ・コントロール」パネルの内容については、「「データ・コントロール」パネルのビジネス・サービスの表示」を参照してください。
EJBおよびJPAベースのBeanデータ・コントロールのほかに、表2-1に示すように名前付き基準のノードが表示されます。名前付き基準は、クイック検索フォームの作成に使用されます。デフォルトでは、「すべての問合せ可能な属性」という名前の暗黙的な名前付き基準が、データ・コントロールの作成時にそれぞれの問合せ可能なコレクションに対して表示されます。「名前付き基準を使用した結果セットのフィルタリング」で説明されているとおり、コレクションごとに追加の宣言的名前付き基準を作成できます。
データ・コントロールからのデータバインドされたUIコンポーネントの作成については、「「データ・コントロール」パネルでのデータバインドされたUIコンポーネントの作成」を参照してください。
EJBおよびBeanデータ・コントロールの組込み操作
EJBデータ・コントロールは、標準の組込みデータ・コントロール操作も提供しています。この操作を使用して、ページ・ナビゲーションおよびデータ操作のためのコマンド・コンポーネントをユーザー・インタフェース内で作成できます。
データ・コントロールに対して使用できるすべての操作については、「データ・コントロールの組込み操作」を参照してください。
「名前付き基準のサポート」オプションおよびページングに関する必知事項
EJBまたはJPAベースのBeanデータ・コントロールを作成する際に提示される「名前付き基準のサポート」オプションは、データ・コントロールによって使用されるハンドラ・クラスに影響を及ぼし、またアクセス・モードなどの機能にも影響を及ぼします。
データ・コントロールを作成する際、スクロール可能アクセス・モードまたは範囲ページング・アクセス・モードを選択した場合、「名前付き基準のサポート」オプションを選択したままにしておく必要があります。それ以外の場合、DataFilterHandler
ハンドラを使用するようにデータ・コントロールが生成されます。つまり、ページング・メソッドを手動で実装する必要があります。(JPQLDataFilterHandler
は、スクロール可能アクセス・モードまたは範囲ページング・アクセス・モードを選択し、かつ「名前付き基準のサポート」オプションを選択したままにしている場合に使用され、追加のコーディングを必要とせずにアクセス・モードを実装します。)
データ・コントロールのアクセス・モードの詳細は、「EJBデータ・コントロールでのデータのページ分割されたフェッチ」を参照してください。
EJBデータ・コントロールのCRUD操作に関する必知事項
EJBデータ・コントロールを作成する際に、CRUD (作成/読取り/更新/削除)機能は、セッションBeanのサービス・メソッドと、セッションBeanに含まれるエンティティBeanに依存します。
たとえば、セッションBeanの永続化メソッドとマージ・メソッドが「データ・コントロール」パネルに表示され、これらのメソッドを使用して作成したボタンにより、ユーザーがオブジェクトの現行インスタンスを永続化およびマージできます。
組込みデータ・コントロール操作も使用可能で、これらの操作を使用してデータ操作をUIにバインドできます。続いて、これらの操作はセッション・ファサードおよびエンティティ・クラス内の該当するメソッドを呼び出します。また、これらの操作はADFイテレータの状態を更新する場合があります。たとえば、データ・コレクションのCreate
操作を呼び出すと、そのコレクションを表すエンティティ・クラスのコンストラクタが呼び出されてインスタンスが作成され、続いてセッションBean内の該当する永続化メソッドが呼び出されて、JPA永続化コンテキストに新規インスタンスが追加されます。その後、新規に作成されたインスタンスはADFイテレータに追加されます。
ヒント:
可能な場合は、組込み操作を使用することが一般には最善策です。これは、これらの操作がJPAエンティティ・マネージャとADFイテレータの両方との通信を処理し、両者の同期を保つからです。
CRUD (作成/読取り/更新/削除)機能をJPAに依存せずに実行する場合は、CRUD操作のためにユーザー独自のロジックを実装することもできます。カスタムCRUD操作の実装の詳細は、「Beanデータ・コントロールのカスタムCRUD操作の有効化」を参照してください。
マージ・メソッドと永続化メソッドに関する必知事項
セッションBeanを作成したときに、マージ・メソッドと永続化メソッドの公開を選択した場合は、これらのメソッドが「データ・コントロール」パネルに表示されます。これらのメソッドを使用して作成したボタンにより、ユーザーはオブジェクトの現行インスタンスのマージと永続化を行うことができます。どちらを使用するかは、更新が行われた後でページとインスタンスとの対話が必要かどうかで決まります。インスタンスを使用し続ける必要がある場合、永続化メソッドを使用します。
マージ・メソッドは、JPA EntityManager.merge
メソッドの実装です。このメソッドは、現在のインスタンスを取得してコピーし、そのコピーをPersistenceContext
に渡します。その後、元のオブジェクトではなく、その永続化されたエンティティへの参照が返されます。つまり、それ以降そのインスタンスに行われる変更は、マージ・メソッドを再度コールしないかぎり永続化されないということです。
永続化メソッドは、JPA EntityManager.persist
メソッドの実装です。マージ・メソッド同様、このメソッドは、現在のインスタンスをPersistenceContext
に渡します。ただし、コンテキストによってそのインスタンスの管理が続けられるため、以降の更新はコンテキスト内のインスタンスに行われます。
削除メソッドに関する必知事項
削除メソッド(JPA永続化コンテキストからオブジェクトを削除するための)を含むセッションBeanまたはJavaサービス・ファサードに基づくデータ・コントロールを使用している場合は、これらのメソッドが他のファサード・メソッドとともに「データ・コントロール」パネルに公開されます。ただし、ADFイテレータにバインドされたフォームまたは表からエンティティを削除する場合は、削除メソッドのかわりにDelete
操作を通常は使用する必要があります。Delete
操作は、ファサードの削除メソッドを呼び出すほか、ADFイテレータに変更について通知することにより、イテレータと永続性コンテキストの同期を保ちます。削除メソッド内でコーディングしたカスタム動作を利用するために削除メソッドを直接呼び出す場合は、ADFイテレータをリフレッシュするためのコードも提供する必要があります。
新規行の自動永続化について
EJB (およびJPAベースのBean)データ・コントロールのほとんどの種類では、Create
操作によって新規行が作成され、行セットに挿入されます。ただし、新規に作成したオブジェクトが永続性コンテキストに追加されることはありません。インスタンスの永続化を作成直後に試行すると、必須フィールドが空であるために制約違反となる可能性があるため、これは暗黙的コミットを行うステートレス・データ・モデルには望ましい動作です。
ただし、モデルによっては、Create
操作時に永続化メソッドを呼び出すオプションがサポートされます。これは、行を永続化するための基礎となるDMLが、コミット時まで据え置かれるからです。JDeveloperの「セッションBean作成」ウィザードを使用して、CMTおよび明示的コミットの動作を使用するステートフル・セッションBeanを生成する場合は、この自動永続化動作をサポートするモデルが生成されます。会話型Webアプリケーションにおけるこのモデルの利点は、アプリケーションがこれらの作成と永続化のステップを単一のジェスチャー(通常はボタン)に結合できることです。複数のインスタンスを作成した後、ユーザーはコミット・ボタンをクリックして、未処理の変更をすべて適用できます。この時点でトランザクションが開始され、データベース内のDML文が実行されて、未処理のINSERT
、UPDATE
、またはREMOVE
の各操作が実行されます。
EJBまたはBeanのデータ・コントロールを作成する際に、クラスがスキャンされて、この「自動永続化」動作の対象になるかどうかが確認されます。対象になる場合は、データ・コントロールのEagerPersist
プロパティがtrue
に設定されます。この初期値をオーバーライドして、必要に応じてこのオプションを有効または無効にすることができます。
エンティティの永続化メソッドの自動呼出しは、一般に次の条件が満たされている場合にのみお薦めします。
-
セッションBeanが明示的なコミット動作を行う(暗黙的コミット動作を行うと、オブジェクトが作成と同時にコミットされるため)。
-
永続化メソッドが呼び出されたときに、モデルがSQLの実行を即座に試行しない。
-
主キー列に対するID生成をセットアップした。主キー値のIDの生成の詳細は、「@GeneratedValueアノテーションを使用した主キーのIDの生成について」を参照してください。
-
EJBセッションBeanがステートフルで、次のものを使用する。
-
コンテナ管理のトランザクション
-
セッションBeanクラスの
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
アノテーション -
コミット・メソッドの
@TransactionAttribute(TransactionAttributeType.REQUIRED
-
JDeveloperの「セッションBean作成」ウィザードを使用して、コンテナ管理のトランザクションと明示的コミット・モデルを使用するステートフル・セッションBeanを作成する場合は、このBeanに対して作成するすべてのデータ・コントロールが、EagerPersist
プロパティをtrue
に設定して生成されます。それ以外の場合、EagerPersist
はfalse
に設定されます。
EagerPersistプロパティを変更する方法
Beanが自動永続化動作を使用する条件を満たしていて(「新規行の自動永続化について」で説明したとおり)、ただしオンになっていない場合(エンティティ・クラスの作成に「エンティティ作成(表ベース)」ウィザードを使用しなかった場合など)は、EagerPersist
プロパティをtrue
に手動で設定できます。同様に、プロパティがtrue
に設定されている場合に、自動永続化動作が必要なければ、プロパティをfalse
に変更できます。
データ・コントロールのEagerPersistプロパティの値を変更する手順は次のとおりです。
- 「データ・コントロール」パネルで、データ・コントロールのルート・ノードを右クリックして、「定義の編集」を選択します。
- ejb定義の「プロパティ」ダイアログで、
EagerPersist
プロパティの値を変更します。
永続性コンテキストと問合せの再発行に関する必知事項
コンテナ管理のステートフル・セッションBeanに基づくデータ・コントロールを使用している場合は、セッション内で行われたコミット前の変更が、データソースに対して行われる後続の問合せに反映されません。このため、ユーザーがトランザクションの途中でデータソースを問い合せる操作を実行した場合、その後でページのデータのリフレッシュを行っても、セッションで行われた変更内容が結果に含まれません。
単一のBeanに対して異なるデータ・コントロールを作成する方法
単一のBeanに対して、データ・コントロールのインスタンスを複数作成できます。これは、比較用のデータ・コントロール機能をUI開発者に提供する必要がある場合に便利です。たとえば、スクロール可能ページングを使用するUIコンポーネントと、範囲ページングを使用するUIコンポーネントの2種類をUI開発者が作成できるようにする場合などが考えられます。
始める前に:
EJBデータ・コントロールの一般的な使用法について理解しておくと役に立ちます。EJBデータ・コントロールの詳細は、「ADFデータ・コントロールを使用したセッションBeanサービスの公開」を参照してください。
アプリケーションでデータ・コントロールに対して使用することが必要になる可能性がある一般的なデータ・コントロール機能を理解しておくと役に立つこともあります。EJBの追加機能の詳細は、「EJBデータ・コントロールの追加機能」を参照してください。
データ・コントロールが使用する、セッションBean内のコード・パターンとコンストラクトについて理解しておくと役に立つこともあります。セッションBeanのコード・パターンの詳細は、「データ・コントロールで使用するセッションBeanの準備」を参照してください。
また、「EJBデータ・コントロールの作成方法」の説明に従って、データ・コントロールを作成する必要があります。
Beanに対して追加のデータ・コントロール・インスタンスを作成する手順は次のとおりです。
- 追加のデータ・コントロール・インスタンスを作成する対象のBeanを右クリックして、「データ・コントロールの作成」を選択します。
- ウィザードの「セッションEJBの選択」ページ(または「Beanクラスの選択」)で、データ・コントロール・インスタンスの一意の名前(前に作成したどのデータ・コントロール・インスタンスとも異なる)を指定します。
- データ・コントロールのそのインスタンスに必要なオプションを指定して、ウィザードを完了します。
追加のデータ・コントロール・インスタンスを作成する際の処理内容
Beanに対して追加のデータ・コントロール・インスタンスを作成する際には、DataControls.dcx
ファイルの概要エディタに追加のハイレベル・ノードが表示されます(図3-3および「データ・コントロール」パネルを参照)。
注意:
UIヒントやバリデータなどの宣言的メタデータをデータ・コントロールに追加する際に、Beanの様々なデータ・コントロール・インスタンスがその同じメタデータを使用します。宣言的メタデータの追加の詳細は、「データ・コントロールへのビジネス・ロジックの追加」を参照してください。
EJBデータ・コントロールでのデータのページ分割されたフェッチ
EJBデータ・コントロールまたはBeanデータ・コントロールを作成するときには、ウィザードの「アクセス・モード」ドロップダウン・リストを使用して、データベースからレコードにどのようにアクセスするか、また同時にメモリーに保持されるレコードの数を制限するかどうかを決定できます。
EJBデータ・コントロールおよびBeanデータ・コントロールでは、データのフェッチとメモリーへの格納については、次のようなことが考えられます。
-
スクロール可能アクセス・モード。
データ・コントロールの作成時にデフォルトを受け入れた場合、データのアクセス・モードは
scrollable
に設定されます。つまり、アプリケーションで表示する必要のあるデータは、必要に応じて(UIコンポーネントのイテレータで指定されたレンジ・サイズと等しい増分で)データベースから取得され、メモリーに格納されます。次に、ユーザーがアプリケーションで前方にスクロールすると、必要に応じて追加の行がフェッチされ、メモリーに格納されます。フェッチされた行はすべて、メモリーに残っています。たとえば、実行中のアプリケーションに、行1から20までを1つのWebページに表示する表が含まれていて、その表のイテレータのレンジ・サイズが25 (デフォルト)の場合は、データ・コントロールでは最初の25行がフェッチされます。結果セットの行477から496までを表示するためにユーザーが下にスクロールした場合は、行26から500までがフェッチされるまで、ユーザーがスクロールするにつれて、データは25件ずつフェッチされます。その時点では、合計500行がメモリーに格納されています。
oracle.adf.model.adapter.bean.DataFilterHandler
およびoracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler
を使用したデータ・コントロールでは、これがデフォルトのモードです。ただし、oracle.adf.model.adapter.bean.DataFilterHandler
を使用したデータ・コントロールでは、アクセス・モードを実装するには、データ・コントロールにページング・メソッドを引き続き追加する必要があります。データ・コントロールでのページ分割の手動追加の詳細は、「データ・コントロールでページ分割サポートを手動で実装する方法」を参照してください。 -
範囲ページング・アクセス・モード
同時にフェッチされメモリーに格納されるレコードの数を制限するために、
rangePaging
アクセス・モードを使用できます。スクロール可能モードと同様に、範囲ページング・モードでも、アプリケーションでデータを増分でフェッチできます。範囲ページング・モードでの大きな違いは、メモリーに残されるのは、最後にフェッチされた増分のみであるということです。したがって、たとえば、アクセッサ・イテレータのrangeSize
属性が25に設定されていると、いずれの時点でも、メモリーに保持されるレコードは25件までです。前述のスクロール可能な例を範囲ページング版に当てはめると、データ・コントロールでは、行1から20までを表示するために、行1から25までをフェッチしてメモリーに保持します。ユーザーが下にスクロールした場合、データ・コントロールでは、ユーザーがスクロールするのに伴ってデータを25件ずつフェッチし、新しい範囲をフェッチするたびに前の25件のレコードをメモリーから解放します。前述の例で、ユーザーが行477から496までに達した時点でメモリーに残っているのは、行476から500までのみです。
複数の増分からのデータを表示する位置までスクロールした時点でメモリーに保持されるのは、最後にフェッチされた増分からのデータのみです。
データ・コントロールの作成時に、「EJBデータ・コントロールの作成」ウィザードの「アクセス・モード」ドロップダウンの「範囲ページング」を選択して、ページ範囲を設定できます。
注意:
データ・コントロールで範囲ページングを使用した場合、そのデータ・コントロールから作成された、データ・バインダされたUIコンポーネントに対して、組込みナビゲーション操作
Last
は機能しません。 -
ページ分割なし。ページ分割がない場合は、UIコンポーネントに使用できるデータがすべてフェッチされます。
「EJBデータ・コントロールの作成」ウィザードの「アクセス・モード」ドロップダウンの「ページングなし」を選択して、ページングを使用しないようにデータ・コントロールを構成できます。
具体的なコレクションに対してページングを無効にするには、アノテーションを使用することもできます。アノテーションを使用したページングの無効化の詳細は、「データ・コントロールで個別オブジェクトにアクセス・モードを指定する方法」を参照してください。
-
カスタム・ページ分割。組込みページ分割オプションがニーズに合わない場合は、カスタム・ハンドラ・クラスを実装することによって、独自のページ分割を実装できます。カスタム・ページ分割の実装の詳細は、「問合せおよびページ分割にカスタム・ハンドラを実装する方法」を参照してください。
アクセス・モードおよびデータ・コントロール・ハンドラの詳細は、「スクロール可能モードおよび範囲ページング・モードに関する必知事項」を参照してください。
データ・コントロールのページング・モードを変更する方法
データ・コントロールのページング・モードを変更する場合は、「データ・コントロール」パネルで変更できます。
注意:
oracle.adf.model.adapter.bean.DataFilterHandler
とoracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler
のどちらかのハンドラを使用したデータ・コントロールでは、デフォルトのアクセス・モードはscrollable
です。
始める前に:
EJBデータ・コントロールおよびBeanデータ・コントロールのアクセス・モードの一般的な知識があると役立ちます。アクセス・モードの詳細は、「EJBデータ・コントロールでのデータのページ分割されたフェッチ」を参照してください。
アプリケーションでデータ・コントロールに対して使用することが必要になる可能性がある一般的なデータ・コントロール機能を理解しておくと役に立つこともあります。EJBデータ・コントロールの追加機能の詳細は、「EJBデータ・コントロールの追加機能」を参照してください。
EJBまたはBeanのデータ・コントロールを作成する必要があります。EJBデータ・コントロールの作成の詳細は、「EJBデータ・コントロールを作成する方法」を参照してください。
データ・コントロールのページング・モードを変更する手順は次のとおりです。
範囲ページングを使用するデータ・コントロールにレンジ・サイズを設定する方法
データ・コントロールのアクセス・モードをrangePaging
に設定すると、データ・コントロールは、データ・コントロール内のコレクションにバインドされる各コンポーネントのアクセッサ・イテレータのrangeSize
プロパティを読み取ることによって、レンジ・サイズを判別します。
コンポーネントのレンジ・サイズを設定する手順は次のとおりです。
- 「アプリケーション」ウィンドウで、データ・コントロールにバインドされるコンポーネントがあるページを選択します。
- 「構造」ウィンドウで、データ・コントロール・コレクションにバインドされるコンポーネントを選択します。
- 「プロパティ」ウィンドウで、「動作」ノードを開き、
rangeSize
プロパティを目的の値に設定します。
イテレータ・バインディングの詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』のページ定義ファイルに作成されるイテレータ・バインディングに関する項を参照してください。
スクロール可能モードおよび範囲ページング・モードに関する必知事項
スクロール可能モードおよび範囲ページング・モードをサポートするデータ・コントロールは、その機能を実装するに際して、Beanクラス内のメソッドに依存しています。データ・コントロールが使用するメソッドは、データ・コントロールが使用するデータ・コントロール・ハンドラ・クラスに依存しています。
JPAベースのデータ・コントロールでは通常、JPQLDataFilterHandler
ハンドラが指定されています。JPQLDataFilterHandler
は、JPA問合せとqueryByRange()
メソッドがBean内に存在しているかどうかに応じて異なります。EJBデータ・コントロールの前提条件と考慮事項の制御の詳細は、「EJBデータ・コントロールの前提条件と考慮事項」を参照してください。
非JPAのBeanデータ・コントロール(およびqueryByRange()
メソッドを持たないEJBデータ・コントロールとJPAベースのデータ・コントロール)の場合は、DataFilterHandler
が指定されます。このハンドラを使用するデータ・コントロールに範囲ページングを実装するには、「データ・コントロールでページ分割サポートを手動で実装する方法」に示されているように、Beanクラスにコードを追加する必要があります。
これらのハンドラ・クラスのいずれも持たないデータ・コントロール(名前付き基準のサポートを明示的にオフにしたEJBデータ・コントロールなど)の場合は、スクロール可能ページングまたは範囲ページングの組込みサポートはありません。ただし、ユーザーが独自のハンドラ・クラスを作成してページング・サポートを実装できます。問合せおよびページ分割のためのカスタム・ハンドラの実装の詳細は、「問合せおよびページ分割にカスタム・ハンドラを実装する方法」を参照してください。
データ・コントロールで個別オブジェクトにアクセス・モードを指定する方法
様々なサイズの複数のコレクションがデータ・コントロールに含まれる場合は、コレクションのいくつかに別々のアクセス・モードを設定することもできます。これを行うには、Bean内でデータ・コントロールが表すアクセッサ・メソッドにアノテーションを配置します。
アノテーションが使用されるメソッドでは、そのアノテーションによって、データ・コントロールに設定されているアクセス・モードがオーバーライドされます。アクセッサ・メソッドにそのようなアノテーションがない場合、そのアクセス・モードは、データ・コントロールに定義されているアクセッサ・メソッドから継承されます。
Beanデータ・コントロールまたはEJBデータ・コントロールで個別オブジェクトにアクセス・モードを指定する手順は次のとおりです。
import oracle.adf.model.adapter.bean.annotation.AccessMode;
import oracle.adf.model.adapter.bean.annotation.AccessModeType;
... * List with scrollable access */@AccessMode(type=AccessModeType.SCROLLABLE)
public List<Employees> getEmployeesScrollable() { ... * List with range paging. */@AccessMode(type=AccessModeType.RANGE_PAGING)
public List<Employees> getEmployeesRangePaging() { ... * List with no paging. */@AccessMode(type=AccessModeType.NO_PAGING)
public List<Employees> getEmployeesNoPaging() { ...
注意:
DataControls.dcx
ファイルにあるAdapterDataControl
要素のDefinition
属性によって指定されるクラス上にアノテーションを配置する必要があります。デフォルトでは、これはBean実装クラスです。
Oracle ADFの12.1.2リリースでは、Definition
属性は、デフォルトでセッションBeanのビジネス・インタフェース(リモートまたはローカル)に設定されました。つまり、アノテーションを、Bean実装クラスではなくビジネス・インタフェースに配置する必要があります。このリリースでこの動作を保持する必要がある場合は、ビジネス・インタフェースを指すようにDefinition
属性の値を変更することができます。
範囲がページ分割されたコレクションに基づいた表のソートに関する必知事項
デフォルトでは、JPAベースのデータ・コントロールにバインドされた表をユーザーがソートした場合、ADFモデル・ランタイムによってイテレータは、すべての行をメモリーに返してソートするように強制されます。これは、バックエンドJPQL問合せがそのソートをデータベース・レベルですでに行っている場合でも同じであり、コレクションが大きすぎるとメモリーに障害が発生する恐れがあります。コレクションに範囲ページングを使用している場合は、ADFモデル・ランタイムによるメモリー内の全ソートを無効にし、そのかわりに、現在選択している範囲に基づいて、ソートをデータ・コントロールに処理させることができます。
データ・コントロールを使用して、範囲がページ分割されたコレクションのソートを処理する手順は次のとおりです。
- 「アプリケーション」ウィンドウで、
DataControls.dcx
ファイルをダブルクリックして概要エディタで開きます。 - 概要エディタで、編集するデータ・コントロールのノードを選択します。
- 「プロパティ」ウィンドウで、
ImplementsSort
プロパティをtrueに設定します。
アノテーションを使用した属性のUIヒントの提供
EJBセッションBeanまたはJavaBeansコンポーネントのデータ・コントロールを作成したら、Javaアノテーションを使用してデータ・オブジェクト属性に対する宣言的メタデータを作成し、UIコンポーネントでの属性の表示方法に関するデフォルトを提供することができます。これにより、UIコンポーネントでこれらのUIヒントを使用して、ロケールに依存した一貫性のある方法で問合せ情報を自動表示することができます。たとえばUIヒントを使用して、該当するゲッターによって返されるフィールドに対応するデータ・コントロール属性からUIコンポーネントを作成する際に、ラベルとツールチップ・テキスト用のデフォルトを提供できます。
Webページで、UI開発者は、EL式ユーティリティ・メソッドを入力することによりUIヒント値にアクセスできます。EL式ユーティリティ・メソッドは、バインディング・ネームスペースで定義され、ADFバインディング・インスタンス名に対して指定されます。「データ・コントロール」パネルを使用して、これらのUIヒントのアノテーションが付けられた属性に基づいてUIコンポーネントを作成すると、ヒントにアクセスするためのEL式がUIコンポーネント・コードで生成されます。これらのEL式に対する構文の詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』のEL式を使用してUIヒントにアクセスする方法に関する項を参照してください。
アノテーションを使用して、次のUIヒントを設定できます。
-
label
- コンポーネントのラベル。 -
tooltip
- コンポーネントのツールチップ。 -
display
- UIにおいてコレクションの場合にフォームおよび表で属性を表示するかどうか。この属性をfalse
に設定すると、この属性は、「データ・コントロール」パネルのコレクションの属性の中に表示されません。 -
width
- コンポーネントの幅(ピクセル単位) -
height
- コンポーネントの高さ(ピクセル単位) -
autoSubmit
- 該当するアクション(クリック、テキスト変更など)が実行されたときにコンポーネントから自動送信を行うかどうか。 -
controlType
- 属性を表示するためにクライアントUIで使用されるコントロールのタイプ。このヒントのデフォルト値はControlHintType.DEFAULT
です。これは、属性のJavaタイプに応じて最適なコンポーネントを選択するようにクライアントによって解釈されます。Javaタイプの属性に対してこのデフォルト値を保持することができます。(このヒントに対して他の値を考えることが意味を持つのは、属性が非Javaタイプに基づいている場合のみです。) -
formatType
- 属性(日付、通貨、パーセンテージなど)に適用される書式設定の種類を定義するクラス。 -
format
- 特に数値または日付値を表示する方法を決定するための書式マスク。たとえば日付の場合、dd/MM/YYYY
と指定できます。これは、最初に日、次に月、最後に年を指定して日付を示し、各部分はスラッシュ(/)によって区切られます。 -
timezoneId
- タイプがDate
の属性の場合、使用される固定タイムゾーンを指定するために使用できます。このUIヒントを設定しない場合、ユーザーのブラウザ(またはUIを表示する他のクライアント)によってタイムゾーンが決定されます。
アノテーションを通して設定できるUIヒントは、XMLデータ・コントロール構造ファイルを使用して宣言的にデータ・コントロールに対して設定できるメタデータのサブセットから構成されます。データ・コントロール構造ファイルを使用すると、宣言的検証ルール、属性のデフォルト値およびオブジェクトの他のメタデータを全体として設定することもできます。データ・コントロール構造ファイルを通してデータ・コントロールを構成するすべての方法の詳細は、「データ・コントロールへのビジネス・ロジックの追加」を参照してください。
注意:
アノテーションとXMLデータ・コントロール構造ファイルを両方使用して属性のUIヒントを設定する場合、データ・コントロール構造ファイルの設定が優先されます。
BeanクラスのUIヒントを提供するために次の3つの高レベルのアノテーションが用意されています。
-
oracle.adf.model.adapter.bean.annotation.AttributeHint
- フィールドのデフォルト・ラベル、ツールチップ、高さおよび幅を指定できます。また、属性を表示するか非表示にするか、ユーザーが入力を完了したときにフィールドを自動的に送信するかどうか、およびフィールドに対してどのようなタイプのコンポーネントを生成するかを指定できます。 -
oracle.adf.model.adapter.bean.annotation.DateFormatter
-Date
属性に対して書式マスクとタイムゾーンを指定できます。format
要素を使用して、MM/dd/YYYY
などの書式マスクを設定できます。書式マスクに使用できる日時パターン文字列の構文の詳細は、java.text.SimpleDateFormat
に関するAPIドキュメント(http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
)を参照してください。 -
oracle.adf.model.adapter.bean.annotation.Formatter
- その他の数値のタイプ(oracle.jbo.format.DefaultCurrencyFormatter
やoracle.jbo.format.PercentageFormatter
など)の書式設定を指定できます。
また、前述のアノテーションに対して使用可能な値を列挙し、前述のアノテーションの使用時にクラスへのインポートが必要になる可能性のある次のサポート・クラスが用意されています。
-
oracle.adf.model.adapter.bean.annotation.ControlHintType
-AttributeHint
属性のcontrolType
要素から参照できるコンポーネントのタイプのリストを提供します。 -
oracle.adf.model.adapter.bean.annotation.FormatterType
-DateFormatter
およびFormatter
アノテーションによって参照されるフォーマッタのタイプのリストを提供します。 -
oracle.adf.model.adapter.bean.annotation.TimeZoneID
-DateFormatter
アノテーションから参照できるタイムゾーンのリストを提供します。
注意:
属性ヒントのアノテーションをメソッドに追加すると、値の入力に役立つJDeveloperの構文補完インサイト機能を使用できます。入力中に構文補完インサイトのポップアップが自動的に表示されない場合は、[Ctrl]を押しながら[Space]を押します
次のコードは、エンティティBeanクラスのgetterメソッドでUIヒントのアノテーションを使用する方法の例です。アノテーションが利用可能になるのは、データ・コントロールを生成した後、またはEJBプロジェクトにADF Model Generic Runtime
ライブラリを追加した後のみです。
import oracle.adf.model.adapter.bean.annotation.AttributeHint; import oracle.adf.model.adapter.bean.annotation.ControlHintType; import oracle.adf.model.adapter.bean.annotation.DateFormatter; import oracle.adf.model.adapter.bean.annotation.FormatterType; import oracle.adf.model.adapter.bean.annotation.TimeZoneID ... @AttributeHint ( label = "Hire Date", tooltip = "Type date in the form MM/dd/YYYY", display = true, controlType = ControlHintType.DEFAULT, width = 40, height = 20, autoSubmit = true) @DateFormatter ( type = FormatterType.SIMPLE_DATE, format = "MM/dd/YYYY", formatter = "", timezoneId = TimeZoneID.DEFAULT) public Date getHireDate() { return hireDate; }
注意:
@Formatter
および@DateFormatter
アノテーションのformatter
要素は、日付または数値の書式を提供するために個別のハンドラ・クラスを指定できる拡張オプションです。たとえば、この要素を使用して、oracle.jbo.format.DefaultDateFormatter
を拡張するハンドラを提供できます。
次の例は、@Formatter
アノテーションを使用して、通貨の書式設定によって属性を表示するように指定する方法を示しています。
import oracle.model.adapter.bean.annotation.Formatter; import oracle.model.adapter.bean.annotation.FormatterType; ... @Formatter (type = FormatterType.CURRENCY) public Integer getMinSalary() { return minSalary; }
@Formatter
type
要素を通して次のフォーマッタを割り当てることができます。
-
BIGDECIMAL
-oracle.jbo.format.DefaultBigDecimalFormatter
によって定義されるタイプCURRENCY
oracle.jbo.format.DefaultCurrencyFormatter
によって定義されるタイプDATE
-oracle.jbo.format.DefaultDateFormatter
PERCENTAGE
-oracle.jbo.format.PercentageFormatter
によって定義されるタイプNUMBER
-oracle.jbo.format.DefaultNumberFormatter
によって定義されるタイプ
注意:
UIヒントのアノテーションを適用する場合、データ・コントロールに基づいて作成するページのデザインタイム・ビューでヒントの影響を確認することはできません。ただし、ADFモデル・テスターを使用してヒントのテストと検証を行うことができます。テスターの使用の詳細は、「Oracle ADFモデル・テスターを使用したデータ・オブジェクト・メタデータのテスト」を参照してください。
EJBデータ・コントロールのフェイルオーバーの有効化
ステートフル・セッション・Beanに基づくEJBデータ・コントロールを構成して、ADFモデル・ランタイムによってその状態が管理されるようにし、データ・コントロールによってカプセル化されたオブジェクトのフェイルオーバーを有効にすることができます。EJBデータ・コントロールのフェイルオーバー・サポートは、Beanデータ・コントロールと同じように動作します。
このフェイルオーバー・サポートのセッションBeanでのメソッド・スタブの生成の詳細は、「EJBデータ・コントロールを作成する方法」を参照してください。それらのメソッドの実装の詳細は、「Beanデータ・コントロールでのフェイルオーバーの有効化」を参照してください。