ヘッダーをスキップ
Oracle Application Development Framework Forms/4GL開発者のための開発者ガイド
10g(10.1.3.0)
B40013-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

D ADF Business Componentsのよく使用されるメソッド

この付録では、Oracle ADFのADF Business Components層のインタフェースおよびクラスでよく使用されるメソッドについて解説します。

この付録には、次の項が含まれます。

D.1 クライアント層でよく使用されるメソッド

この項で説明するインタフェースはすべて、クライアント層のコード用であり、oracle.jbo.*パッケージに含まれています。


注意:

oracle.jbo.*インタフェース用の対応する実装クラスは、クライアント・コードによって直接アクセスされないように意識的に設計されています。後述のD.2項「ビジネス・サービス層でよく使用されるメソッド」で説明するように、該当する実装クラスはoracle.jbo.server.*パッケージの中に存在し、クライアント層コードで使用しないようユーザーに喚起するため、一般にImplという接尾辞が名前に付いています。

D.1.1 ApplicationModuleインタフェース

ApplicationModuleは、他のADFコンポーネント用のトランザクション・コンテナとして動作するビジネス・サービス・コンポーネントであり、それらのADFコンポーネントと協調して、ビジネス・アプリケーションの開発者にとって重要な一連のJ2EEデザイン・パターンを実装します。それらのデザイン・パターンの実装により、クライアント・コードは、クライアントに必要なデータのみを取得してクライアントが望む方法で表示するFast Lane ReaderのSQL問合せに基づいて、更新可能な一連の値オブジェクトと簡単に連携できます。それらの値オブジェクトに行われた変更は、ビジネス・サービス層内の永続的なビジネス・ドメイン・オブジェクトと自動的に協調して、ビジネス・ルールを首尾一貫して施行し、データベースに変更を保存します。

表D-1 ApplicationModuleインタフェース

実行する処理 コールするApplicationModuleインタフェースのメソッド

既存のビュー・オブジェクト・インスタンスに名前でアクセス

findViewObject()

既存の定義を使用して新しいビュー・オブジェクト・インスタンスを作成

createViewObject()

SQL文を使用して新しいビュー・オブジェクト・インスタンスを作成

createViewObjectFromQueryStmt()

注意:

動的問合せのSELECTリストの形を規定するために、実行時にオーバーヘッドが発生します。これは、問合せのSELECTリストが設計時に不明な場合にのみ使用してください。また、なんらかの種類のカスタムなランタイム・リポジトリに基づいて動的問合せを作成する場合は、このヒントを参考にすると、作業は少し増えるものの、ランタイムの規定に関するオーバーヘッド無しで動的ビュー・オブジェクト(読取り専用および更新可能)を作成できます。WHEREのみを動的にする必要がある場合は、ビュー・オブジェクトを設計時に作成し、ViewObject APIを使用して必要に応じてWHERE句を動的に設定します。

ネストしたアプリケーション・モジュール・インスタンスに名前でアクセス

findApplicationModule()

既存の定義を使用して、ネストした新しいアプリケーション・モジュール・インスタンスを作成

createApplicationModule()

ネストしたアプリケーション・モジュール内でビュー・オブジェクト・インスタンスを検索

findViewObject()

注意:

ネストしたアプリケーション・モジュールに属するビュー・オブジェクトのインスタンスを検索するには、nestedAMInstanceName.VOInstanceNameというドット表記法を使用します。

現在のトランザクション・オブジェクトにアクセス

getTransaction()


ApplicationModuleによる汎用的なアクセスのみでなく、Oracle JDeveloper 10gでは、ユーザーがクライアントに公開することを選択したサービスレベルのカスタム・メソッドが含まれるカスタムなYourApplicationModuleNameインタフェースも生成できます。その場合は、アプリケーション・モジュール・エディタの「クライアント・インタフェース」タブにアクセスし、クライアント・インタフェースに表示するメソッドを「選択済」リストに表示します。また、JDeveloperは、アプリケーション・モジュールをEJBセッションBeanとしてデプロイする場合またはアプリケーション・モジュールをバッチ・モードで使用する場合にリモート・クライアントによって自動的に使用される適切なクライアント・プロキシ実装クラスYourApplicationModuleNameClientも生成します。

D.1.2 Transactionインタフェース

Transactionインタフェースでは、現在のトランザクション内で保留中の変更をクライアントが管理できるようなメソッドを公開しています。

表D-2 Transactionインタフェース

実行する処理 コールするTransactionインタフェースのメソッド

保留中の変更をコミット

commit()

保留中の変更をロールバック

rollback()

1回かぎりのデータベース・コマンドまたはPL/SQLブロックを実行

executeCommand()

注意:

OUTパラメータの取得が必要なコマンド、複数回実行されるコマンドまたはバインド変数の使用により利点が得られる可能性があるコマンドでは、このメソッドを使用しないでください。その場合は、アプリケーション・モジュールでカスタム・メソッドを公開してください。

トランザクション内のすべての保留中の無効な変更を検証

validate()

デフォルトのロック・モードを変更

setLockingMode()

注意:

構成内のロック・モードは、プロパティjbo.locking.modeに、サポートされている4つの値(noneoptimisticpessimisticoptupdate)のいずれか1つを設定すると、設定できます。明示的に設定しないと、pessimisticがデフォルト値になります。Webアプリケーションの場合は、optimisticモードまたはoptupdateモードを使用してください。

バンドルされている例外レポート・モードを使用するかどうかを決定

setBundledExceptionMode()

注意:

ADFコントローラ・レイヤー・サポートでは、Webアプリケーションの場合、このパラメータは自動的にtrueに設定されます。

トランザクションのコミットに成功した場合にエンティティ・キャッシュを消去するかどうかを決定

setClearCacheOnCommit()

注意:

デフォルトはfalseです。

トランザクションのロールバック時にエンティティ・キャッシュを消去するかどうかを決定

setClearCacheOnRollback()

注意:

デフォルトはtrueです。

特定のエンティティ・オブジェクトのエンティティ・キャッシュを消去

clearEntityCache()


D.1.3 ViewObjectインタフェース

ViewObjectを使用すると、データベース問合せがカプセル化され、得られた結果のRowSetを簡単に操作できます。ビュー・オブジェクトを使用すると、SQLを使用して1つまたは複数の表のビジネス・データに対してプロジェクト、フィルタ、結合またはソートを実行し、該当するページまたはパネル上でユーザーに表示されるものと同じフォーマットにすることができます。ビュー・リンクを使用してビュー・オブジェクトを結合すると、任意のレベルの深さまたは複雑性を備えるマスター/ディテール階層を作成できます。ビュー・オブジェクトは、読取り専用の問合せ結果を作成できます。また、設計時に1つまたは複数のエンティティ・オブジェクトと関連付けると、完全に更新可能にすることができます。更新可能なビュー・オブジェクトでは、正確なビジネス・ドメイン・オブジェクトに対する自動的な委譲により、結果コレクション内の行の挿入、変更および削除をサポートできます。

ViewObjectでは、デフォルト行セットを集約し、ユースケースの90%を簡略化します。その場合は、ViewObjectの問合せ結果に対してRowSetを1つ使用します。ViewObjectは、このデフォルトのRowSetに委譲することにより、RowSetインタフェース上ですべてのメソッドを実装します。つまり、どのRowSetメソッドも、任意のViewObject上で同様に起動できます。

どのViewObjectでもStructureDefインタフェースを実装し、行セット内の各行の属性の数とタイプに関する情報を提供します。そのため、StructureDefメソッドは任意のビュー・オブジェクト上でコールできます。

表D-3 ViewObjectインタフェース

実行する処理 コールするViewObjectインタフェースのメソッド

行セット上で追加のランタイムWHERE句を設定

setWhereClause()

注意:

このWHEREは、基本ビュー・オブジェクト内で設計時に指定されたWHERE句をさらに増やします。置換ではありません。

動的なORDER BY句を設定

setOrderByClause()

QBE基準コレクションを作成

createViewCriteria()

注意:

その後、作成したViewCriteriaオブジェクト上でcreateViewCriteriaRow()メソッドを使用し、ViewCriteriaRowオブジェクトを1つまたは複数作成します。そして、add()を使用してそれらのビュー基準行をビュー基準コレクションに追加し、すぐ後のメソッドを使用してその基準を適用します。

QBE基準コレクションを適用

applyViewCriteria()

問合せオプティマイザ・ヒントを設定

setQueryOptimizerHint()

ビュー・オブジェクト内のキー属性の属性定義にアクセス

getKeyAttributeDefs()

該当するビュー・オブジェクトの行セット内の行に動的属性を追加

addDynamicAttribute()

ビュー・オブジェクトによって作成された行セットをすべて消去

clearCache()

ビュー・オブジェクト・インスタンスとそのリソースを削除

remove()

ビュー・オブジェクトがデータベースからフェッチしようとする行数に上限を設定

setMaxFetchSize()

注意:

デフォルト値である-1の場合は、データベースから取得する行数(すべて反復処理する場合)に制限はありません。デフォルトでは、それらの行は、ユーザーが反復処理を実行するのに伴って遅延フェッチされます。


ViewObjectによる汎用的なアクセスのみでなく、JDeveloper 10gでは、ユーザーがクライアントに公開することを選択したビューオブジェクト・レベルのカスタム・メソッドが含まれるカスタムなYourViewObjectNameインタフェースも生成できます。その場合は、ビュー・オブジェクト・エディタの「クライアント・インタフェース」タブにアクセスし、クライアント・インタフェースに表示するメソッドを「選択済」リストに表示します。また、JDeveloperは、アプリケーション・モジュールをEJBセッションBeanとしてデプロイする場合またはアプリケーション・モジュールをバッチ・モードで使用する場合にリモート・クライアントによって自動的に使用される適切なクライアント・プロキシ実装クラスYourViewObjectNameClientも生成します。

D.1.4 RowSetインタフェース

RowSetは、通常はViewObjectの問合せの実行によって作成される一連の行のことです。

RowSetでは、デフォルト行セット・イテレータを集約し、ユースケースの90%を簡略化します。その場合は、該当する行セットに対して必要なイテレータは1つのみです。RowSetは、このデフォルトのRowSetIteratorに委譲することにより、RowSetIteratorインタフェース上ですべてのメソッドを実装します。つまり、どのRowSetIteratorメソッドも、任意のRowSet(または、デフォルトのRowSetでRowSetも実装するViewObject)上で起動できます。

表D-4 RowSetインタフェース

実行する処理 コールするRowSetインタフェースのメソッド

WHERE句のバインド変数値を設定

setWhereClauseParam()

注意:

バインド変数の序数位置はゼロ・ベースです。

データが一度しか読み取られない場合はビュー・オブジェクト行のキャッシングを回避

setForwardOnly()

行セットの問合せを強制的に(再)実行

executeQuery()

ビュー・オブジェクトの問合せ結果の行数を推定

getEstimatedRowCount()

ビュー・オブジェクト行セット内の行に対してXML文書を作成

writeXML()

受信XML文書内の全行を処理

readXML()

他の行セットによって作成された同じエンティティ・オブジェクトに基づいて、行セットが新規行を自動的に確認するかどうかを設定

setAssociationConsistent()

プログラムによる反復で使用するセカンダリ・イテレータを作成

createRowSetIterator()

注意:

後で名前を使用してセカンダリ・イテレータを検出し、使用する場合は、文字列名を引数として渡します。そうでない場合は、nullを名前として渡し、反復処理の終了時はイテレータのcloseRowSetIterator()メソッドをコールしてイテレータを閉じてください。


D.1.5 RowSetIteratorインタフェース

RowSetIteratorは、RowSet内の行に対するイテレータです。デフォルトでは、行の反復処理を順方向にも逆方向にも実行できます。

表D-5 RowSetIteratorインタフェース

実行する処理 コールするRowSetIteratorインタフェースのメソッド

イテレータの行セットの先頭行を取得

first()

反復処理の対象となる行がまだ存在しているかどうかをテスト

hasNext()

イテレータの行セットの次の行を取得

next()

指定したキー値を持つ行をこのイテレータの行セット内で検索

findByKey()

注意:

findByKeyに渡すKeyオブジェクトは、使用中のビュー・オブジェクト内で一連の行のキーを構成している属性とまったく同じデータ型を使用して作成することが重要です。

挿入目的で移入する新しい行を作成

createRow()

注意:

該当する新しい行は、エンティティ・オブジェクトまたはビュー・オブジェクトのレベルで提供されている静的なデフォルト値を持つ属性の場合、または基礎となるエンティティ・オブジェクトのオーバーライドされたcreate()メソッドで値が移入済の場合、デフォルト値がすでに設定されています。

外部キーまたは識別子(あるいはその両方)の属性値の初期セットを使用してビュー行を作成

createAndInitRow()

注意:

このメソッドは、エンティティ・オブジェクトの一連のサブタイプから構成されるファミリの1つを返すことができるビュー・オブジェクトを使用する場合に使用します。行を作成するためのコールで正確な識別子属性値を渡すことにより、フレームワークは合致するエンティティ・オブジェクトの正しいサブタイプを下に作成することができます。

イテレータの行セットに新しい行を挿入

insertRow()

注意:

新しく作成した行を、常に行セットにただちに挿入するようにしてください。それにより、行を作成したものの、行セットに挿入し忘れるという間違いをなくすことができます。

イテレータの行セットの最終行を取得

last()

イテレータの行セットの直前の行を取得

previous()

現在の行ポインタを先頭行の前のスロットにリセット

reset()

反復処理の実行時にイテレータを終了

closeRowSetIterator()

指定した行を現在の行に設定

setCurrentRow()

現在の行を削除

removeCurrentRow()

現在の行を後で同一イテレータ内の別の場所に挿入するために削除

removeCurrentRowAndRetain()

現在の行を現在のコレクションから削除(ただし、トランザクションからは削除しない)

removeCurrentRowFromCollection()

範囲(ユーザーが表示できるページ)当たりの行数を設定/変更

setRangeSize()

スクロールしてNページ(1がベース)目の行を表示

scrollToRangePage()

スクロールして、行番号Nから始まる行範囲を表示

scrollRangeTo()

範囲内の行番号Nを現在の行に設定

setCurrentRowAtRangeIndex()

範囲内の全行をRow配列として取得

getAllRowsInRange()


D.1.6 Rowインタフェース

Rowは、汎用的な値オブジェクトです。それに含まれる属性は、関連先ViewObjectの名前およびJavaタイプに適しています。

表D-6 Rowインタフェース

実行する処理 コールするRowインタフェースのメソッド

名前を使用して属性の値を取得

getAttribute()

名前を使用して属性の値を設定

setAttribute()

単一行のXML文書を作成

writeXML()

行の検証を積極的に実行

validate()

XMLからの行の属性値の読取り

readXML()

行を削除

remove()

新しく作成した行への一時的としてのフラグ付け(再度更新されるまで)

setNewRowState(Row.STATUS_INITIALIZED)

行の属性構造の定義情報を取得

getStructureDef()

行のキー・オブジェクトを取得

getKey()


Rowによる汎用的なアクセスのみでなく、JDeveloper 10gでは、型保証属性のgetterメソッドおよびsetterメソッドに加えて、ユーザーがクライアントに公開することを選択した望ましい行レベルのカスタム・メソッドも含まれるカスタムなYourViewObjectNameRowインタフェースも生成できます。その場合は、ビュー・オブジェクト・エディタの「カスタム行インタフェース」タブにアクセスし、クライアント・インタフェースに表示するメソッドを「選択済」リストに表示します。また、JDeveloperは、アプリケーション・モジュールをEJBセッションBeanとしてデプロイする場合またはアプリケーション・モジュールをバッチ・モードで使用する場合にリモート・クライアントによって自動的に使用される適切なクライアント・プロキシ実装クラスYourViewObjectNameRowClientも生成します。

D.1.7 StructureDefインタフェース

StructureDefは、の構造に関する実行時メタデータにアクセスするためのインタフェースです。

また便宜上、各ViewObjectは、StructureDefインタフェースも実装しており、一連の属性に関するメタデータへのアクセスを、問合せによって生成されるビュー行によって提供します。

表D-7 StructureDefインタフェース

実行する処理 コールするStructureDefインタフェースのメソッド

ビュー・オブジェクト行内の全属性の属性定義にアクセス

getAttributeDefs()

名前を使用して属性定義を検出

findAttributeDef()

索引を使用して属性定義を取得

getAttributeDef()

1行内の属性数を取得

getAttributeCount()


D.1.8 AttributeDefインタフェース

AttributeDefが提供する属性定義情報は、属性名、Javaタイプ、SQLタイプのような、ビュー・オブジェクト行またはエンティティ・オブジェクト・インスタンス用属性のためのものです。また、ユーザーが記述する汎用コードによってインスペクトできるカスタム属性固有のメタデータ・プロパティや、属性およびその値を適切なユーザー・インタフェースに表示する際に役立つUIヒントへのアクセスも提供されます。

表D-8 AttributeDefインタフェース

実行する処理 コールするAttributeDefインタフェースのメソッド

属性のJavaタイプを取得

getJavaType()

属性のSQLタイプを取得

getSQLType()

注意:

int値は、JDBCクラスjava.sql.Types内の定数に対応しています。

属性の種類を特定

getAttributeKind()

注意:

簡単な属性の場合は、定数ATTR_PERSISTENTATTR_SQL_DERIVEDATTR_TRANSIENTATTR_DYNAMICATTR_ENTITY_DERIVEDのいずれか1つが返されます。1対1または多対1のアソシエーション/ビュー・リンク・アクセッサの場合は、ATTR_ASSOCIATED_ROWが返されます。1対多または多対多のアソシエーション/ビュー・リンク・アクセッサの場合は、ATTR_ASSOCIATED_ROWITERATORが返されます。

配列値属性に含まれる要素のJavaタイプを取得

getElemJavaType()

配列値属性に含まれる要素のSQLタイプを取得

getElemSQLType()

属性の名前を取得

getName()

属性の索引位置を取得

getIndex()

数値属性の精度または文字列属性の最大値を取得

getPrecision()

数値属性のスケールを取得

getScale()

属性に対応する基礎となる列名を取得

getColumnNameForQuery()

属性に固有なカスタム・プロパティ値を取得

getProperty(), getProperties()

属性のUI AttributeHintsオブジェクトを取得

getUIHelper()

属性が必須かどうかをテスト

isMandatory()

属性が問合せ可能かどうかをテスト

isQueriable()

属性が行の主キーの一部であるかどうかをテスト

isPrimaryKey()


D.1.9 AttributeHintsインタフェース

属性に関連するAttributeHintsインタフェースは、属性とその値を適切なユーザー・インタフェースに表示する際に使用できる属性のUIヒント情報を公開します。

表D-9 AttributeHintsインタフェース

実行する処理 コールするAttributeHintsインタフェースのメソッド

属性のUIラベルを取得

getLabel()

属性のツールチップを取得

getTooltip()

与えられたフォーマット・マスクを使用して、属性のフォーマット化された値を取得

getFormattedAttribute()

属性の表示ヒントを取得

getDisplayHint()

注意:

DisplayまたはHideという文字列値を持ちます。

属性の優先されるコントロールのタイプを取得

getControlType()

属性で提供されるフォーマット・マスクを使用して、フォーマット化された文字列値を解析

parseFormattedAttribute()


D.2 ビジネス・サービス層でよく使用されるメソッド

前述のoracle.jbo.*インタフェースに対応する実装クラスは、クライアント・コードによって直接アクセスされないように意識的に設計されています。該当する実装クラスはoracle.jbo.server.*という別のパッケージの中に存在し、クライアント層コードで使用しないようユーザーに喚起するため、Implという接尾辞が名前に付いています。

ビジネス・サービス層の実装コードでは、前述のクライアントから利用できるのと同じメソッドを使用できますが、次の処理も実行できます。

この項では、ADF Business Componentsの主要なクラスでコール、記述およびオーバーライドの対象としてよく使用されるメソッドのサマリーを示します。

D.2.1 コンポーネントでのカスタムJavaファイルの制御

個々のクラスの仕様を調べる前に、コンポーネントで使用するカスタムJavaファイルの制御方法を理解することが重要です。カスタマイズされたサブクラスがコンポーネントで不要な場合は、基本フレームワーク・クラスで実装を実行時に処理するだけですみます。

ユーザーが作成する各ビジネス・コンポーネントは、単一のXMLコンポーネント・ディスクリプタと、関連するカスタムJava実装ファイル(ゼロ個以上)から構成されます。Javaのカスタマイズをサポートする各コンポーネントでは、JDeveloper 10g IDEのComponent Editorに「Java」タブが表示されます。一連のJavaクラスを選択または選択解除することにより、コンポーネント用に作成するJavaクラスを制御します。いずれのチェック・ボックスも選択しないと、コンポーネントはXMLのみのコンポーネントになり、そのJava実装として基本フレームワーク・クラスのみが使用されます。そうでない場合は、現在のコンポーネントでカスタマイズする必要がある関連するJavaクラスのチェック・ボックスを選択します。JDeveloper 10gによってフレームワーク・ベース・クラスのカスタムなサブクラスが作成され、その中にコードを追加できます。


注意:

「ツール」「設定」「ビジネス・コンポーネント」を選択し、チェック・ボックスを選択してデフォルト値を設定すると、ADFビジネス・コンポーネントのタイプごとにデフォルトでJavaクラスを生成する必要のあるグローバルなIDE設定を設定できます。

エンティティ・オブジェクト・クラスおよびビュー行クラスは常に生成するのがベスト・プラクティスです。それは、自動的に生成されるgetterおよびsetterメソッド以外に、それらの中にカスタム・コードが不要な場合にも当てはまります。getterおよびsetterメソッドを使用すると、コンパイル時に型チェックが実行されるため、間違って属性に正しくない種類の値を設定した場合、実行時にエラーが発生するのを防止できます。

D.2.2 ApplicationModuleImplクラス

ApplicationModuleImplクラスは、アプリケーション・モジュール・コンポーネント用のベース・クラスです。アプリケーション・モジュールは、ビジネス・サービスの実装に使用するADFコンポーネントであるため、アプリケーション・モジュール・クラスはサービスレベルのアプリケーション・ロジックを記述できる場所と考えてください。アプリケーション・モジュールは、ビュー・オブジェクト・インスタンスと協調して、ビジネス・ドメイン・オブジェクトに自動的に関連付けされる更新可能な一連の値オブジェクトをサポートします。ビジネス・ドメイン・オブジェクトは、ADFエンティティ・オブジェクトとして実装されます。

D.2.2.1 ApplicationModuleImpl上でよくコールされるメソッド

表D-10 ApplicationModuleImpl上でよくコールされるメソッド

実行する処理 コールするApplicationModuleImplクラスのメソッド

(クライアント内から実行することもできる)一般的なアプリケーション・モジュール処理をクラス内から実行

前述のD.1.1項「ApplicationModuleインタフェース」を参照してください。

アプリケーション・モジュールのデータ・モデルに設計時に追加したビュー・オブジェクト・インスタンスにアクセス

getViewObjectInstanceName()

注意:

JDeveloper 10gは、この型保証ビュー・オブジェクト・インスタンスのgetterメソッドを自動的に生成して、アプリケーション・モジュールの設計時のデータ・モデルに各ビュー・オブジェクト・インスタンスを反映します。

現在のDBTransactionオブジェクトにアクセス

getDBTransaction()

設計時にアプリケーション・モジュールに追加した、ネストしたアプリケーション・モジュール・インスタンスにアクセス

getAppModuleInstanceName()

注意:

JDeveloper 10gは、この型保証アプリケーション・モジュール・インスタンスのgetterメソッドを自動的に生成して、現在のアプリケーション・モジュールに設計時に追加された、ネストした各アプリケーション・モジュール・インスタンスを反映します。


D.2.2.2 カスタムなApplicationModuleImplサブクラスでよく記述されるメソッド

表D-11 カスタムなApplicationModuleImplサブクラスでよく記述されるメソッド

実行する処理 記述するカスタムなApplicationModuleImplクラスのメソッド

データベース・ストアド・プロシージャを起動

someCustomMethod()

注意:

DBTransactionインタフェースの該当するメソッドを使用して、JDBC PreparedStatementを作成します。ストアド・プロシージャにOUTパラメータがある場合は、かわりにCallableStatementを作成します。

アプリケーション・モジュール内でPL/SQLストアド・プロシージャに対するコールをカプセル化する堅牢なコード例については、このサンプル・プロジェクトを参照してください。

カスタムなビジネス・サービス・メソッドをアプリケーション・モジュール上で公開

someCustomMethod()

注意:

アプリケーション・モジュール・エディタの「クライアント・インタフェース」パネルでメソッド名を選択し、クライアントからアクセスできるように必要に応じて公開します。


JDeveloper 10gでは、ユーザーがクライアントに公開することを選択したサービスレベルのカスタム・メソッドが含まれるカスタムなYourApplicationModuleNameインタフェースを生成できます。その場合は、アプリケーション・モジュール・エディタの「クライアント・インタフェース」タブにアクセスし、クライアント・インタフェースに表示するメソッドを「選択済」リストに表示します。

D.2.2.3 カスタムなApplicationModuleImplサブクラスでよくオーバーライドされるメソッド

表D-12 カスタムなApplicationModuleImplサブクラスでよくオーバーライドされるメソッド

実行する処理 オーバーライドするApplicationModuleImplクラスのメソッド

最初はアプリケーション・モジュールの作成時、以降はそのアプリケーション・モジュールが異なるアント・セッションによって使用されるときにカスタムな設定コードを実行

prepareSession()

注意:

これは、データベースのOracle仮想プライベート・データベース(VPD)機能を使用することを目的として現在のユーザーのためにクライアント別コンテキスト情報を設定する際に使用するメソッドです。このメソッドは、その他の種類のPL/SQLパッケージ・グローバル変数(値はクライアントに固有で、他のストアド・プロシージャが依存している可能性がある)を設定する際にも使用できます。

このメソッドは、アプリケーション・モジュール内の指定されたビュー・オブジェクト・インスタンスに固有な設定コードを実行する際にも有用です。インスタンスに固有ではなく、該当するビュー・オブジェクト・コンポーネントから作成されるインスタンスごとにビュー・オブジェクト設定コードを初期化する場合は、かわりにViewObjectImplサブクラス内のオーバーライド対象のcreate()メソッドに設定ロジックを記述します。

アプリケーション・モジュールのトランザクションが接続プールのデータベース接続と関連付けられた後に、カスタムな設定コードを実行

afterConnect()

注意:

getDBTransaction().executeCommand()を使用してALTER SESSION SET SQL TRACE TRUEを実行し、現在のアプリケーション接続のデータベースSQL Traceロギングを有効にするコード行の記述に便利な場所です。これらのログはその後、TKPROFユーティリティを使用して処理すると、実行対象のSQL文および使用対象の問合せオプティマイザ計画を調査することができます。

アプリケーション・モジュールのトランザクションがそのデータベース接続をデータベース接続プールに解放する前に、カスタムな設定コードを実行

beforeDisconnect()

注意:

jbo.doconnectionpoolingをtrueに設定しておくと、アプリケーション・モジュールがアプリケーション・モジュール・プールに返されるたびに、接続がデータベース接続プールに解放されます。

カスタムなアプリケーション・モジュールの状態の状態管理XMLスナップショットへの書出し

passivateState()

カスタムなアプリケーション・モジュールの状態を状態管理XMLスナップショットから読み込んでリストア

activateState()


D.2.3 DBTransactionImpl2クラス

DBTransactionImpl2クラス(ベースのDBTransactionImplクラスを拡張し、DatabaseTransactionFactoryクラスによって作成される)は、DBTransactionインタフェースを実装するベース・クラスであり、現在のトランザクション内で保留中の作業ユニットを表します。

D.2.3.1 DBTransaction上でよくコールされるメソッド

表D-13 DBTransaction上でよくコールされるメソッド

実行する処理 DBTransactionオブジェクトでコールするメソッド

トランザクションをコミット

commit()

トランザクションをロールバック

rollback()

トランザクション内のすべての保留中の無効な変更を積極的に検証

validate()

トランザクションのConnectionオブジェクトを使用してJDBC PreparedStatementを作成

createPreparedStatement()

トランザクションのConnectionオブジェクトを使用してJDBC CallableStatementを作成

createCallableStatement()

トランザクションのConnectionオブジェクトを使用してJDBC Statementを作成

createStatement()

トランザクションの警告リストに警告を追加

addWarning()


D.2.3.2 カスタムなDBTransactionImpl2サブクラスでよくオーバーライドされるメソッド

表D-14 カスタムなDBTransactionImpl2サブクラスでよくオーバーライドされるメソッド

実行する処理 カスタムなDBTransactionImpl2クラスでオーバーライドするメソッド

トランザクション・コミット操作の前または後でカスタム・コードを実行

commit()

トランザクション・ロールバック操作の前または後でカスタム・コードを実行

rollback()


カスタムなDBTransactionImpl2サブクラスを実行時に使用するには、次の2つの手順を実行する必要があります。

  1. 次のようにcreateメソッドをオーバーライドしてカスタムなDBTransactionImpl2サブクラスのインスタンスを返すようなDatabaseTransactionFactoryのカスタムなサブクラスを作成します。

    package com.yourcompany.adfextensions;
    import oracle.jbo.server.DBTransactionImpl2;
    import oracle.jbo.server.DatabaseTransactionFactory;
    import com.yourcompany.adfextensions.CustomDBTransactionImpl;
    public class CustomDatabaseTransactionFactory
           extends DatabaseTransactionFactory {
      /**
       * Return an instance of our custom CustomDBTransactionImpl class
       * instead of the default implementation.
       *
       * @return An instance of our custom DBTransactionImpl2 implementation.
       */
      public DBTransactionImpl2 create() {
        return new CustomDBTransactionImpl();
      }
    }
    
  2. 構成プロパティTransactionFactoryの値にカスタムなトランザクション・ファクトリの完全修飾クラス名を設定して、カスタムなトランザクション・ファクトリ・クラスを使用するようフレームワークに指示します。他の構成プロパティの場合と同様に、構成XMLファイル内で指定しない場合は、かわりに同名のJavaシステム・パラメータとして指定することもできます。

D.2.4 EntityImplクラス

EntityImplクラスは、ビジネス・ドメイン・オブジェクトのデータ、検証規則およびビジネス動作をカプセル化するエンティティ・オブジェクトのベース・クラスです。

D.2.4.1 EntityImpl上でよくコールされるメソッド

表D-15 EntityImpl上でよくコールされるメソッド

実行する処理 EntityImplサブクラスでコールするメソッド

属性の値を取得

getAttributeName()

注意:

コード生成されたgetterメソッドは、getAttributeInternal()をコールしますが、コンパイル時に型チェックが実行されます。

属性の値を設定

setAttributeName()

注意:

コード生成されたsetterメソッドは、setAttributeInternal()をコールしますが、コンパイル時に型チェックが実行されます。

名前を使用して属性の値を取得

getAttributeInternal()

名前を使用して属性の値を設定

setAttributeInternal()

エンティティ・オブジェクトの検証を積極的に実行

validate()

データベースのエンティティをリフレッシュ

refresh()

変更中というマークを付けずに属性の値を移入(ただし、変更中という通知が送信されるため、UIが値を画面/ページ上でリフレッシュ)

populateAttributeAsChanged()

エンティティの定義オブジェクトにアクセス

getDefinitionObject()

エンティティのキー・オブジェクトを取得

getKey()

現在のトランザクション内でポスト済であるかどうかに関係なく(ただし、未コミット状態)、エンティティ・インスタンスの状態を判別

getEntityState()

注意:

現在のトランザクション内のエンティティ・インスタンスのステータスを示す定数(STATUS_UNMODIFIEDSTATUS_INITIALIZEDSTATUS_NEWSTATUS_MODIFIEDSTATUS_DELETEDまたはSTATUS_DEAD)の1つが返されます。

エンティティ・インスタンスの状態を判別

getPostState()

注意:

このメソッドは通常、postChanges()メソッドを使用しプログラムでポストを実行する(ただし、エンティティの変更をデータベースにまだコミットしておらず、そのポスト状態に関してエンティティの状態を検出する必要がある)場合にのみ使用します。

データベースから読み取った特定の属性値を取得

getPostedAttribute()

エンティティ・インスタンスのデータベース行を積極的にロック

lock()


D.2.4.2 カスタムなEntityImplサブクラスでよく記述されるメソッド

表D-16 カスタムなEntityImplサブクラスでよく記述されるメソッド

実行する処理 EntityImplサブクラスで記述するメソッド

属性に固有な検証を実行

public boolean validateSomething(AttrTypevalue)

注意:

エンティティ・オブジェクト・エディタの「検証」パネル内の正しい属性に対してMethodValidatorを追加することにより、属性バリデータ・メソッドを登録します。

エンティティレベルの検証を実行

public boolean validateSomething()

注意:

エンティティ・オブジェクト・エディタの「検証」パネル内のエンティティに対して「MethodValidator」を追加することにより、エンティティレベルのバリデータ・メソッドを登録します。

一時属性の値を計算

生成されたgetAttributeName()メソッドに計算コードを追加します。


D.2.4.3 EntityImpl上でよくオーバーライドされるメソッド

表D-17 EntityImpl上でよくオーバーライドされるメソッド

実行する処理 EntityImplサブクラスでオーバーライドするメソッド

新しいエンティティ・インスタンスの主キー属性値をプログラムで移入することも含めて、計算後のデフォルト属性値を設定

create()

注意:

super.create()をコールした後、適切なsetAttrName()メソッド(複数可)をコールし、該当する属性のデフォルト値を設定します。

データベースに対して変更をポストする前に属性値を変更

prepareForDML()

ユーザーのエンティティ・オブジェクトのかわりにフレームワークがデータベースに対して実行する標準のINSERT、UPDATEまたはDELETE DML操作を拡張/変更

doDML()

注意:

操作フラグの値を定数DML_INSERTDML_UPDATEまたはDML_DELETEに照らしてチェックし、どのようなDML操作が実行されているのかをテストします。

すべてのエンティティ・インスタンスがデータベースに対してポストされた後で、該当する変更がコミットされる前に、SQLベースの複雑な検証を実行

beforeCommit()

新しく作成された関連する親エンティティが、それに依存する現在の子エンティティより前にデータベースにポストされることを保証

postChanges()

注意:

該当する子エンティティにコンポジット・アソシエーションによって親エンティティが関連付けられている場合、これはフレームワークによって自動的に処理済です。(構成されているわけではなく)関連付けられているだけの場合は、postChanges()メソッドをオーバーライドして、新しく作成された親エンティティに、それに依存している現在の子エンティティより前にポストの実行を強制する必要があります。通常、オーバーライド対象のpostChanges()メソッドで記述してこれを実現するためのコードについては、このOTN記事を参照してください。



注意:

属性レベルの検証コードは、EntityImplクラスの適切なsetAttributeNameメソッドの中に直接記述することができます。ただし、前述のMethodValidatorのアプローチを使用すると、エンティティ・オブジェクト・エディタの「検証」タブのみを確認してエンティティ・オブジェクトで有効なすべての検証を理解できるため、コンポーネントを理解しやすくなります。


警告:

また、validateEntity()メソッドをオーバーライドして、エンティティレベルの検証コードを記述することもできます。ただし、ADFにバンドルされている例外モード(フレームワークが検証エラーの最大セットを収集し、クライアント・ユーザー・インタフェースに報告する)の利点を活用するには、前述の表で示したMethodValidatorのアプローチを採用してください。その場合は、ユーザーの検証メソッドがスローするユーザー例外をフレームワークがすべて自動的に収集するので、ユーザーはバンドルされている例外実装メカニズムを理解する必要がありません。validateEntity()メソッドを直接オーバーライドすると、ユーザー独自のコードで行う処理がシフトし、Oracle ADFによりデフォルトで処理されるような例外のキャッチおよびバンドルを正しく実行するという処理になります。これは、ささやかな処理ですが、覚えておく必要があり、毎回のハンドコードが必要です。


D.2.5 EntityDefImplクラス

EntityDefImplクラスは、単一のJava VM内で所定のタイプを持つ全エンティティ・オブジェクトに対するシングルトンの共有メタデータ・オブジェクトです。これは、エンティティ・インスタンスの構造を定義し、新規エンティティ・インスタンスを作成するメソッドおよび主キーによって既存のインスタンスを探すメソッドを提供します。

D.2.5.1 EntityDefImpl上でよくコールされるメソッド

表D-18 EntityDefImpl上でよくコールされるメソッド

実行する処理 コールするEntityDefImplのメソッド

該当するタイプのエンティティ・オブジェクトをその主キーを使用して検索

findByPrimaryKey()

注意:

findByPrimaryKey()でサブタイプ・エンティティのエンティティ・インスタンスも検索するには、このヒントを参照してください。

現在のDBTransactionオブジェクトにアクセス

getDBTransaction()

完全修飾名を使用してEntityDefImplオブジェクトを検索

findDefObject()(静的メソッド)

エンティティ・オブジェクトのカスタム・プロパティの値を取得

getProperty(), getProperties()

エンティティ・オブジェクトのカスタム・プロパティの値を設定

setProperty()

エンティティ・オブジェクトの新規インスタンスを作成

createInstance2()

注意:

同じカスタムなEntityDefImplサブクラス内で期待される独自のシグネチャを使用して、カスタムなcreateXXX()メソッドを公開することもできます。詳細は、次の項を参照してください。

該当するエンティティ・タイプのキャッシュ内でエンティティ・インスタンスの反復処理を実行

getAllEntityInstancesIterator()

エンティティ定義オブジェクトのArrayListにアクセスし、現在のエンティティを拡張するエンティティを取得

getExtendedDefObjects()


D.2.5.2 EntityDefImpl上でよく記述されるメソッド

表D-19 EntityDefImpl上でよく記述されるメソッド

実行する処理 記述するカスタムなEntityDefImplクラスのメソッド

属性値または設定情報から構成される初期型保証セットを持つエンティティ・インスタンスの作成を他のクラスに許可

createXXXX(Type1arg1, ..., TypeNargN)

注意:

内部ではこれにより、NameValuePairsオブジェクトのインスタンス(AttributeListを実装する)が作成されて移入され、保護されたメソッドcreateInstance()がコールされ、NameValuePairsオブジェクトが渡されます。これに対するコールを他のクラスに許可する場合、該当メソッドはpublicである必要があります。


D.2.5.3 EntityDefImpl上でよくオーバーライドされるメソッド

表D-20 EntityDefImpl上でよくオーバーライドされるメソッド

実行する処理 コールするEntityDefImplのメソッド

該当するシングルトン・メタオブジェクトのロード時にカスタムなメタデータの初期化を実行

createDef()

Refresh-On-Insert属性またはRefresh-on-Update属性をサポートするためにRETURNING INTO句の使用を回避

isUseReturningClause()

注意:

RETURNING INTOの使用を無効化するには、falseを返します。これは、データベース・レベルでRETURNING INTOをサポートしていない、INSTEAD OFトリガーを持つビューにエンティティ・オブジェクトが基づいている場合に必要なことがあります。

該当するエンティティのために発行されたUPDATE文が、変更された列のみ更新するのか、すべての列を更新するのかを制御

isUpdateChangedColumns()

注意:

デフォルト値はtrueです。

完全修飾名を使用してEntityDefImplオブジェクトを検索

findDefObject()

注意:

静的メソッド。

エンティティ・オブジェクトのカスタム・プロパティの値を設定

setProperty()

ビュー・オブジェクトによる暗黙的な方法ではなく、エンティティ・オブジェクトの新規インスタンスの作成を他のクラスに許可

createInstance()

注意:

直前の項で説明したようにカスタムなcreateメソッドを記述しない場合は、このメソッドをオーバーライドして可視性をprotectedからpublicに広げ、エンティティ・インスタンスの作成を他のクラスに許可します。


D.2.6 ViewObjectImplクラス

ViewObjectImplクラスは、ビュー・オブジェクトのベース・クラスです。

D.2.6.1 ViewObjectImpl上でよくコールされるメソッド

表D-21 ViewObjectImpl上でよくコールされるメソッド

実行する処理 コールするViewObjectImplのメソッド

(クライアント内から実行することもできる)一般的なビュー・オブジェクト、行セットまたは行セット・イテレータ操作をクラス内から実行。

D.1.3項「ViewObjectインタフェース」D.1.4項「RowSetインタフェース」およびD.1.5項「RowSetIteratorインタフェース」を参照してください。

デフォルトの行セット上で追加のランタイムWHERE句を設定。

setWhereClause()

名前付きバインド・パラメータを定義。

defineNamedWhereClauseParam()

名前付きバインド・パラメータを削除。

removeNamedWhereClauseParam()

名前を使用して、デフォルト行セット上のバインド変数値を設定。ビュー・オブジェクト上で名前付きのバインド変数を以前定義してある場合にのみ機能します。

setNamedWhereClauseParam()

デフォルト行セット上のバインド変数値を設定。このメソッドは、名前付きバインド変数が未定義の場合に、Oracle PositionalまたはJDBC Positionalというバインド・スタイルを持つビュー・オブジェクトに対して使用します。

setWhereClauseParam()

メモリー内フィルタ式の評価に基づいてビュー・オブジェクトの行セット内の行のサブセットを取得。

getFilteredRows()

メモリー内フィルタ式の評価に基づいてビュー・オブジェクトの行セット内の現在の範囲内にある行のサブセットを取得。

getFilteredRowsInRange()

該当するビュー・オブジェクトのラウンドトリップごとにデータベースからフェッチされる行の数を設定。

setFetchSize()

注意:

デフォルトのフェッチ・サイズは、一度に1行です。ビュー・オブジェクトで多数の行を取得しようとする場合、これは明らかに最適とはいえません。そのため、ビュー・オブジェクト・エディタの「チューニング」タブで設計時のフェッチ・サイズを増やすか、このAPIを使用して実行時にフェッチ・サイズを設定します。


D.2.6.2 カスタムなViewObjectImplサブクラスでよく記述されるメソッド

表D-22 カスタムなViewObjectImplサブクラスでよく記述されるメソッド

実行する処理 ViewObjectImplサブクラスで記述するメソッド

バインド変数自体の位置詳細を公開することなくバインド変数値を設定する型保証メソッドをクライアントに提供

someMethodName(Type1arg1, ..., TypeNargN)

注意:

このメソッドは、内部でsetWhereClauseParam() APIをコールし、型保証メソッドの引数で提供される値を使用して、正しいバインド変数を設定します。


JDeveloper 10gでは、ユーザーがクライアントに公開することを選択したビュー・オブジェクトのカスタム・メソッドが含まれるカスタムなYourViewObjectNameインタフェースを生成できます。その場合は、ビュー・オブジェクト・エディタの「クライアント・インタフェース」タブにアクセスし、クライアント・インタフェースに表示するメソッドを「選択済」リストに表示して行います。

D.2.6.3 カスタムなViewObjectImplサブクラスでよくオーバーライドされるメソッド

表D-23 カスタムなViewObjectImplサブクラスでよくオーバーライドされるメソッド

実行する処理 オーバーライドするViewObjectImplのメソッド

ビュー・オブジェクト・インスタンスが初めて作成されるときにカスタムなビュー・オブジェクト・クラスのメンバー(行属性ではない)を初期化

create()

注意:

このメソッドは、作成されるビュー・オブジェクトの各インスタンスに適用可能な設定ロジックをアプリケーション・モジュールのコンテキスト内で実行する際に有用です。

汎用的なビュー・オブジェクト設定ロジックではなく、アプリケーション・モジュール内の特定のビュー・オブジェクト・インスタンスに固有なロジックを実行する必要がある場合は、アプリケーション・モジュールのApplicationModuleImplサブクラスのprepareSession()メソッドをオーバーライドした後、該当ロジックをそこで実行します(findViewObject()をコールしてプロパティが設定の対象となるビュー・オブジェクト・インスタンスを特定してから)。

カスタムなビュー・オブジェクト・インスタンスの状態の状態管理XMLスナップショットへの書出し

passivateState()

カスタムなビュー・オブジェクト・インスタンスの状態を状態管理XMLスナップショットから読み込んでリストア

activateState()

問合せがexecuteQuery()をコールして明示的に実行されたか、問合せが未実行の際にfirst()行にナビゲートするなどして暗黙的に実行されたかには関係なく、ビュー・オブジェクト問合せ実行の動作をカスタマイズ

executeQueryForCollection()

ViewCriteriaRowViewCriteriaコレクションをQBE WHERE句に変換する方法を変更/拡張

getViewCriteriaClause()


D.2.7 ViewRowImplクラス

ViewObjectImplクラスは、ビュー行オブジェクトのベース・クラスです。

D.2.7.1 ViewRowImpl上でよくコールされるメソッド

表D-24 ViewRowImpl上でよくコールされるメソッド

実行する処理 記述するカスタムなViewRowImplクラスのメソッド

(クライアント内から実行することもできる)一般的なビュー行処理をクラス内から実行

前述のD.1.6項「Rowインタフェース」を参照してください。

属性の値を取得

getAttrName()

属性の値を設定

setAttrName()

該当するビュー行からの属性保存場所の委譲先である基礎となるエンティティ・インスタンスにアクセス

getEntityUsageAliasName()

注意:

エンティティ・オブジェクトの慣用名(別名)は、ビュー・オブジェクト・エディタの「エンティティ・オブジェクト」タブで変更できます。


D.2.7.2 ViewRowImpl上でよく記述されるメソッド

表D-25 ViewRowImpl上でよく記述されるメソッド

実行する処理 記述するカスタムなViewRowImplクラスのメソッド

ビュー・オブジェクト・レベルの一時属性の値を計算

getAttrName()

注意:

メソッドのスケルトンは、JDeveloperによって自動的に生成されます。ただし、メソッド本体内のカスタムな計算ロジックは、ユーザーが記述する必要があります。

ビュー行属性の設定というカスタムな処理を実行

setAttrName()

注意:

メソッドのスケルトンは、JDeveloperによって自動的に生成されます。ただし、メソッド本体内のカスタムなロジックは、ユーザーが必要に応じて記述する必要があります。

属性の更新の可能性を条件付きの方法で判断

isAttributeUpdateable()

論理演算を現在行で公開するカスタム・メソッド(オプションでクライアントからコール可能)

doSomething()

注意:

これらのビュー行レベルのカスタム・メソッドは、単に反転し、現在行に関連する基礎となるエンティティ・オブジェクト上のメソッド・コールに委譲することがよくあります。


JDeveloper 10gでは、ユーザーがクライアントに公開することを選択したビュー行のカスタム・メソッドが含まれるカスタムなYourViewObjectNameRowインタフェースを生成できます。その場合は、ビュー・オブジェクト・エディタの「カスタム行インタフェース」タブにアクセスし、クライアント・インタフェースに表示するメソッドを「選択済」リストに表示して行います。

D.2.7.3 カスタムなViewRowImplサブクラスでよくオーバーライドされるメソッド

表D-26 カスタムなViewRowImplサブクラスでよくオーバーライドされるメソッド

実行する処理 記述するカスタムなViewRowImplクラスのメソッド

属性の更新の可能性を条件付きの方法で判断

isAttributeUpdateable()


D.2.8 フレームワーク・ベース・クラスの独自層の設定

アプリケーションに固有なビジネス・コンポーネントの開発を開始する前に、このドキュメントで解説されているADF Business Componentsフレームワーク実装のベース・クラスをすべて拡張するクラスから構成される層を独自に作成してください。アプリケーション・モジュール・コンポーネントのカスタムのフレームワーク・ベース・クラスの例を、次に示します。

package com.yourcompany.adfextensions;
import oracle.jbo.server.ApplicationModuleImpl;
public class CustomApplicationModuleImpl extends ApplicationModuleImpl {
  /*
   * We might not yet have any custom code to put here yet, but
   * the first time we need to add a generic feature that all of
   * our company's application modules need, we will be very happy
   * that we thought ahead to leave ourselves a convenient place
   * in our class hierarchy to add it so that all of the application
   * modules we have created will instantly benefit by that new feature,
   * behavior change, or even perhaps, bug workaround.
   */
}

ユーザーが選択したパッケージ名(com.yourcompany.adfextensionsなど。それぞれがoracle.jbo.server.*パッケージをインポート)のカスタマイズされたフレームワーク・ベース・クラスの共通セットは、次のクラスで構成されます。

  • public class CustomEntityImpl extends EntityImpl

  • public class CustomEntityDefImpl extends EntityDefImpl

  • public class CustomViewObjectImpl extends ViewObjectImpl

  • public class CustomViewRowImpl extends ViewRowImpl

  • public class CustomApplicationModuleImpl extends ApplicationModuleImpl

  • public class CustomDBTransactionImpl extends DBTransactionImpl2

  • public class CustomDatabaseTransactionFactory extends DatabaseTransactionFactory

完全を期するために、次のクラスに対してもカスタムなフレームワーク・クラスを作成できます。ただし、これらのクラス内でのオーバーライドは、必要性があまりありません。

  • public class CustomViewDefImpl extends ViewDefImpl

  • public class CustomEntityCache extends EntityCache

  • public class CustomApplicationModuleDefImpl extends ApplicationModuleDefImpl