ビュー・オブジェクトは一連の行の定義や操作を行うクラスで、多くの場合、ユーザー・インタフェースとして使用されます。通常、ビュー・オブジェクトにはデータベースからデータを選択するSQL問合せが含まれています。データベースのデータを変更できるように、基礎となるエンティティ・オブジェクトと関連付けることもできます。また、エンティティ・オブジェクトとはまったく関連付けないことも可能です。
ビュー・オブジェクトはSQL問合せを使用して、エンティティ・オブジェクトの属性に関連付け可能な、ビジネス・データのフィルタリングされたサブセットを指定します。クライアントが何を表示する必要があるかに基づいてビューを作成します。データのビューは、基礎となるエンティティ・オブジェクトに基づくこともできますが、これに依存しないこともできるため、必要なUIをサポートする柔軟性の高いデータ取得が実現します。つまり、画面に表示する必要のあるデータのセットを問い合せできます。ビュー・オブジェクトでは、ビュー行クラスの属性が定義されます。ビュー行クラスは、問合せ結果の行を表し、基礎となるエンティティ・オブジェクトを参照します(オプション)。ビュー・オブジェクトにより、クライアントには、基礎となるエンティティ・オブジェクトを意識せずに、またはこれらに関する知識がない場合でも、スクロールして更新ができる行セットが提供されます。クライアントは結果セット内を移動し、属性値を取得および設定することにより、データを操作します。トランザクションがコミットされると、基礎となるデータベース内のデータが変更されます。ビュー・オブジェクト間の関係は、ビュー・リンクを使用して表されます。各ビュー・オブジェクトは、結果セット内の移動に使用できるデフォルトのイテレータを提供します。
たとえば、次の図に、ビュー・オブジェクト、エンティティ・オブジェクト、および基礎となるデータベース表の関係を示します。EmpNames
というビュー・オブジェクトが、エンティティ・オブジェクトEmp
を操作し、EMP表のEMPNO列およびENAME列のビューを提供します。
ビュー・オブジェクトは、通常、次の場合に使用されます。
定義済の行および列のセットへのアクセスを制限することにより、さらに高度なセキュリティを追加する場合。たとえば、(給与などの)機密性の高いデータを含む列を除外したビュー・オブジェクトを作成できます。
データの複雑性を隠す場合。たとえば、1つのビュー・オブジェクトに、複数のエンティティ・オブジェクトの列または行を表示できます。このようなビュー・オブジェクトでは、データが複数の表から取得されたものであるという事実が隠されています。
表示形式をカスタマイズする場合。ビュー・オブジェクトを使用することにより、ビュー・オブジェクトの基礎となっているエンティティ・オブジェクトに影響を与えずに、列の名前を変更できます。
複雑な問合せを保存する場合。問合せにより、表データに関する大量の計算を実行できます。この問合せをビュー・オブジェクトに保存すると、ビュー・オブジェクトの問合せが実行されたときのみ計算が実行されます。計算が実行されてから、データがデータベースから取得されます。
最適化され、実行にかかる時間の短いSQLを使用し、必要なデータのみを選択することにより、アプリケーションの効率を高める場合。
次に示す一般的なタイプのビュー・オブジェクトは、設計時または実行時に動的に定義できます。
ビュー・オブジェクトにSQL問合せが含まれますか |
少なくとも1つのビュー属性がエンティティ属性にマップされていますか |
ビュー・オブジェクトの使用方法 |
利点 |
---|---|---|---|
はい | はい | データの問合せ、更新、挿入および削除 | 同じエンティティ・オブジェクトにマップされている他のビュー・オブジェクトとのデータの整合性、メモリーの節約 |
はい | いいえ | データの問合せ | エンティティ・オブジェクトにマップするとき、特に順方向のみのモードの使用時(ビューのキャッシュが行われない)のオーバーヘッドの削減(および時間の短縮) |
いいえ | はい | データの挿入 | 最初の問合せの実行省略による起動時間の短縮 |
いいえ | いいえ | データの一時的な収集 | データに対する一貫した同一インタフェースの使用と、ユーザー・インタフェースへのデータの容易なバインド |
さらに、データベース以外のデータソースを使用できます。たとえば、フラット・ファイル、スプレッドシートまたはXMLファイルなどです。この場合は、ビュー・オブジェクトがデータソースからデータを読み取り、エンティティ・オブジェクトがデータをデータソースに書き込むように、カスタム・コードを作成する必要があります。
1つのエンティティ・オブジェクトに対して複数のビュー・オブジェクトを定義できます。また、1つのビュー・オブジェクトは複数のエンティティ・オブジェクトからデータを選択できます。データはエンティティ・オブジェクト・レベルでキャッシュされ、同じトランザクション内のすべてのビュー・オブジェクト参照でそのキャッシュを共有するため、あるビュー・オブジェクトを介して行われた変更は、同じトランザクション内の他のビュー・オブジェクトでただちに使用可能になります。
たとえば、次の図に、複数のエンティティ・オブジェクトから選択するビュー・オブジェクトを示します。DeptEmpおよびEmpNamesというビュー・オブジェクトは、Empエンティティ・オブジェクトのデータを選択します。DeptEmpはDeptエンティティ・オブジェクトからもデータを選択します。
ビュー・オブジェクトを定義する場合、どの基礎エンティティ・オブジェクトを読取り専用にするか、およびどのエンティティ・オブジェクトでビュー・オブジェクトの属性リスト内の属性に対する読み書き操作を可能にするかを指定できます。たとえば、EMP表とDEPT表(関連付けられたEmp
およびDept
エンティティ・オブジェクトを含む)に基づいてビュー・オブジェクトを定義する場合、Emp
情報を変更可能にし、Dept
情報はサポート情報としてのみ表示するよう指定できます。
アプリケーション・モジュール・ウィザードおよびアプリケーション・モジュール・エディタでは、マスター/ディテール関係でビュー・オブジェクトをリンクするために使用するビュー・リンクを選択できます。ビュー・リンクは、実行時に実行されるコード内でも指定できます。ディテール・ビュー・オブジェクトは、自動的に、対応するマスター・ビュー・オブジェクトと同期化されます。
アプリケーション・モジュールは、無制限ビューやディテール・ビューなど同じビュー・オブジェクトを何回も使用できます。別名を指定して、所定のビュー・オブジェクトの様々な使用方法を表すことができます。
たとえば、次の図に、マスター/ディテール・ビュー(DeptView)と最上位レベルのビュー(EmpView)を使用するアプリケーション・モジュールを示します。ビュー・リンクによりマスター/ディテール関係でリンクされたDEPT表およびEMP表のビューと、EMP表の最上位レベルのビューを表示できます。DeptView
の別名はMyDeptView
です。EmpView
ビュー・オブジェクトには、(マスター/ディテール・リンクで使用される)MyEmpDetailView
および(最上位レベルのビューを表す際に使用される)MyEmpView
という2つの別名があります。
Business Components for Javaでは、設計時にウィザードによってSQL問合せが自動的に作成されます。ただし、必要に応じてSQL問合せをカスタマイズできます。問合せ全体を完全に制御する必要がある場合は、エキスパート・モードの問合せを定義できます。
通常、実行時には次のような順序で処理されます。
クライアント・コードにより、アプリケーション・モジュールが初期化されます。アプリケーション・モジュールは、1つ以上の関連ビュー・オブジェクトを含み、データベースに接続し、データベース・トランザクションのコンテキストを提供します。
ビュー・オブジェクトにより、実行時に問合せが参照されます。設計時にウィザードを使用して問合せを指定することも、リテラルSQL文字列をハードコードして問合せを指定することもできます。実行時に、ビュー・オブジェクトを作成してインスタンス化したり、アプリケーション・モジュールでメソッドをコールしてインスタンス化済のビュー・オブジェクトを検索して再利用できます。
ビュー・オブジェクトは、問合せを実行する際、1つ以上のエンティティ・オブジェクトで表された1つ以上の表からのデータを操作します。Oracle Business Componentsは、ビュー・オブジェクトをリフレッシュするためのプル・モデルを実装しています。すなわち、ビュー・オブジェクトは、イテレータによりデータが要求されるまで、その問合せを実行しません。
問合せの実行後、ユーザーはビュー・オブジェクトのメソッドをコールして結果セットの中を移動できます。結果セット全体を使用しない場合、Rangeを設定し、指定した数の行を使用できます。結果セットの各行はRowオブジェクトで表されます。Rowオブジェクトの各属性は、その行内の列の値を表します。クライアントは、アプリケーション・モジュールにより提供されたトランザクション・コンテキスト内で行属性値を取得および設定することにより、データを操作します。ビューを介して行われたデータ変更は、各ビュー・オブジェクトの基礎となっている1つ以上のエンティティ・オブジェクト内にカプセル化されたビジネス・ロジックにより自動的に検証されます。このカプセル化により、ユーザー・インタフェースからビジネス・ロジックが切り離されます。
変更(ある場合)をデータベースにコミットし、更新済のデータを他のアプリケーション・モジュールおよび他のユーザーに使用可能にします。
ビュー・オブジェクトで順方向のみのモードを使用して、データをビュー・キャッシュに挿入しないようにできます。順方向のみのモードを使用すると、メモリーには一度に1つのビュー行のみが保持されるためメモリー・リソースと時間を節約できます。順方向のみのモードは、データをフェッチしていったん読み込む場合(Webページ用のデータの書式設定、または線形的に処理を行うバッチ処理などの場合)に使用すると便利です。ビュー・オブジェクトが1つ以上のエンティティ・オブジェクトに基づいている場合には、通常、データはエンティティ・キャッシュに渡されますが、ビュー・キャッシュには行は追加されません。
createViewObjectFromQueryStmt
メソッドまたはcreateViewObjectFromQueryStmtClauses
メソッドのどちらかを使用して作成された動的ビュー・オブジェクトでは、最初にデータをフェッチするとき、問合せが2回実行される場合があります。最初の問合せでは、データ型と精度の情報が収集されます。この情報は、データを適切なJava型で返し、問合せの効率を上げるために、後の問合せで使用されます(後の問合せでは、最大サイズではなく、小さなサイズまたは事前定義したサイズでデータの取得を行えます)。最初に問合せを2回実行するとパフォーマンス上問題がある、負荷の高い問合せの場合、回避策として、行を返さないダミーのWHERE句を使用してまずビュー・オブジェクトを作成し、そのビュー・オブジェクトに対してメタデータ問合せと属性定義を容易にするgetAttributeCount
をコールし、データのフェッチに必要な問合せを使用してsetQuery
をコールします。このようにすると、負荷の高い問合せを2回実行せずにすみます。最初の問合せは同じデータセットに対する単純な問合せになります。
アプリケーション・モジュールとはエンティティ・オブジェクトとは
ビュー属性とは
ビジネス・ロジック層におけるキャッシュ・データ処理方法