Business Components for Javaフレームワークでは、エンティティ・オブジェクトを定義(表からJavaクラスへのマッピングを定義)し、エンティティ・オブジェクトと関連付けられている表に対してSQL文を使用してビュー・オブジェクトを作成できます。ビュー・オブジェクトに関連付けられたSQL SELECT文により、エンティティ・オブジェクトに関連付けられた表から関連情報の一部を選択できます。基礎となるエンティティ・オブジェクト内の属性すべてを選択するか、あるいは一部のみを選択することが可能です。
ビュー・オブジェクトを作成する場合、クライアントに必要な属性のみを含めることをお薦めします。たとえば、ユーザーが編集可能なフォームに、10個の属性がリスト表示されるようなクライアント・アプリケーションを作成するとします。また、エンティティ・オブジェクトに関連付けられた表には、合計200個の属性が含まれるとします。この場合、クライアント上に表示される10個の属性のみが含まれるビュー・オブジェクトを設計できます。属性の1つは、主キーとする必要があります。JDeveloperのビュー・オブジェクト・ウィザードを使用してビュー・オブジェクトを作成した場合、主キーは自動的に組み込まれます。
ビュー・オブジェクトが実行されると、SQL文がデータベースに送信されます。この文により、主キー列を含む10個の属性が選択されます。フレームワークでは、主キー列を使用して各エンティティ・オブジェクト・インスタンスを一意に識別します。各インスタンスは、データベース表の行に対応します。部分的に移入された(10個の属性が移入された)状態のエンティティ・オブジェクトが、エンティティ・キャッシュに入れられます。
通常、アプリケーションでは、書き込むデータよりも読み取るデータの方が多くなります。このため、読取りと検索のみを実行するアプリケーションでは、必要な情報だけを取得してキャッシュすることが重要になります。前述の例では、取得されてキャッシュに入れられる属性は10個のみで、エンティティ・オブジェクトにより参照される残りの190個の属性は除外されます。これにより、メモリーを節約し、パフォーマンスの低下を避けることができます。
クライアント上のユーザーが、指定した値によって、除外されている190個の属性のいずれかの値がビジネス・ロジックにより要求されると、フレームワークでは、データベースに移動し、主キー値を使用して行の属性200個すべてを取得します。これが、フレームワークのフォルトインと呼ばれるメカニズムであり、クライアントが除外された属性にアクセスしようとすると、エンティティ・オブジェクトによりすべての属性が取得されます。フォルトインは、エンティティ・オブジェクトのインスタンス・レベルで行われます。フォルトインの後、キャッシュには、フォルトインの結果として完全に移入された1行が含まれます。
ビュー・オブジェクトを設計する際は、次のことを考慮する必要があります。
ビュー・オブジェクトの属性リストには、頻繁にアクセスされる属性を必ず含めるようにします。また、このリストには、ビュー・オブジェクトの作成時に基礎となったエンティティ・オブジェクトに対応する表の主キーも含めます。
Business Components for Javaフレームワークでは、クライアントは、ビュー・オブジェクトの属性リストから除外された属性にもアクセスできます。ただし、除外された属性にアクセスするとフォルトインが発生し、メモリーの消費およびパフォーマンスの低下を招くため、注意が必要です。フォルトインが何度も発生すると、パフォーマンスが著しく低下します。多数の属性を含むエンティティ・オブジェクトについては特に、ビュー属性リストの調整が重要です。
次の例は、多少不自然ではありますが、除外された属性への要求によりどのようにフォルトイン・メカニズムが起動されるかを示しています。
従業員の情報(従業員番号、従業員名、役職名、入社日、給与)を定義する表をデータベースに作成します。表は次のように定義します。
CREATE TABLE ORACLE_EMP
(EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
HIREDATE DATE,
SAL NUMBER(7,2),
CONSTRAINT EMP_PRIMARY_KEY PRIMARY KEY (EMPNO));
JDeveloperを使用してビジネス・コンポーネント・プロジェクトを作成します。ウィザードで、Oracle_EMP
表を選択し(これにより、OracleEmp
エンティティ・オブジェクトを作成)、「ビュー・オブジェクトおよびビュー・リンク」チェックボックスと「アプリケーション・モジュール」チェックボックスをチェックします。ウィザードで、OracleEmp
の属性に次のマッピングを定義します。
EmpNum -- EMPNO
EmpName -- ENAME
EmpJob -- JOB
EmpHireDate -- HIREDATE
EmpSal -- SAL
ウィザードで、マッピングするビュー属性を選択するよう要求されたら、次のように選択します。
EmpNum (corresponds to primary key)
EmpName
EmpJob
次のようなビュー・オブジェクト問合せが作成されます。
SELECT (OE.EMPNO AS EMP_NUM, OE.ENAME AS EMP_NAME, OE.JOB AS EMP_JOB)
FROM ORACLE_EMP OE;
ここでOE
とは、ORACLE_EMP
表の別名です。
次に、役職が変更された時点で給与の検証を行うようなビジネス・ロジックを作成するとします。このロジックは、Job
属性(Emp
エンティティ・オブジェクト)のセッター・メソッドに対する検証となります。
public void setJob(String value) {
// Retrieve the salary out of the entity.
// When getSal() is called on the entity the
// framework faults in all the excluded attributes.
Object sal = getSal(); // this line causes a fault-in
setAttributeInternal(JOB, value);
}
getSal()
メソッドにより、エンティティ・キャッシュからSal
という値のフェッチが試行されます。ただし、Sal
はSELECT文から除外されているため、取得されません。これに応答し、Business Components for Javaフレームワークでは、行全体のフォルトインが行われ、エンティティ・キャッシュ内のその行のすべての属性に値が移入されます。