JDeveloperでは、ビュー・リンクにより定義された関係を使用して、複数のエンティティ・オブジェクトにアクセスして得られる結果を定義できます。JDeveloperでは、ビュー・リンクにより返されるデータへの容易なアクセスを提供するメソッドをエンティティ・オブジェクト内に作成することで、これを行います。
このトピックでは、ビュー・リンクをエンティティ・オブジェクトに公開する例を示します。データベースから、特定の部門の退職した従業員のレコードを削除するビジネス・ロジックを記述するとします。データベースでは、退職した従業員は負の従業員番号で表されているとします。ビュー・リンクを使用し、従業員番号が負である行のみを返すアクセッサ・メソッドを作成できます。これには、ビュー・リンク・ウィザードを使用し、リンク元およびリンク先のビュー・オブジェクト、アクセッサ・メソッドの名前、リンク元およびリンク先のロール属性および必要なデータを返すSQL文を指定します。
Dept
エンティティ・オブジェクトとEmp
エンティティ・オブジェクト、DeptView
ビュー・オブジェクトとEmpView
ビュー・オブジェクトを含むプロジェクトがすでにある場合は、次の手順に従い、ビュー・リンクをエンティティ・オブジェクトに公開できます。
ナビゲータでビジネス・コンポーネント・パッケージを右クリックし、「新規ビュー・リンク」を選択してビュー・リンク・ウィザードを開きます。
「名前」ページで、ビュー・リンクの名前をDeptToEmpVLとします。「次へ」をクリックします。
「ビュー・オブジェクト」ページで、リンク元ビューとして「DeptView」を、リンク先ビューとして「EmpView」を選択します。「次へ」をクリックします。
「リンク元の属性」および「リンク先の属性」ページで、「Deptno」を選択します。「次へ」をクリックします。
「SQL設定」ページで、AND Emp.Empno<0を「WHERE」フィールドに追加します。この結果、問合せ文は、Dept.DEPTNO = Emp.DEPTNO AND Emp.Empno<0となります。「次へ」をクリックします。
「ビュー・リンク・プロパティ」ページで、「アクセッサの生成」の「エンティティ・アクセッサ」を選択し、TerminatedEmpsを「アクセッサ名」フィールドに入力します。「次へ」をクリックします。
「終了」をクリックすると、ビュー・リンクが生成されます。
JDeveloperでは、次のようなコードがDeptImpl.java
ファイルに追加されます。
/**
* Uses the link DeptToEmpVL to return rows of EmpView
*/
public oracle.jbo.RowIterator getTerminatedEmps() {
return (oracle.jbo.RowIterator)getAttributeInternal(TERMINATEDEMPS);
}
特定の部門の退職した従業員のレコードをデータベースから削除するには、Dept
エンティティ・オブジェクトに次のようなコードを記述します。
public void purge() {
oracle.jbo.Row r;
oracle.jbo.RowIterator empRSI = getTerminatedEmployees();
while(empRSI.hasNext()) {
r = empRSI.next();
r.remove();
}
}
purge()
メソッドは、Dept
エンティティ・オブジェクトに対し使用できるオペレータです。このようにして、ビジネス・ロジックおよびオペレータを作成します。
その後、purge()
メソッドをプログラムの一部として使用し、退職した従業員を削除します。次のメソッドdoProcess()
で、purge()
が正しく機能するかテストします。このメソッドでは、Dept
およびEmp
のビュー・オブジェクトを検索し、最初の部門の最初の従業員を退職したものとしてマークし、その後、purge()
をコールして、この従業員のレコードをデータベースから削除します。
public void doProcess() throws Exception {
appModule = getApplicationModule("HRappModule");
// get view usages
ViewObject deptVO = appModule.findViewObject("DeptView");
ViewObject empVO = appModule.findViewObject("EmpView");
// setup dataWriter to retrieve and output data
openWriter();
deptVO.setRangeSize(-1);
empVO.setRangeSize(-1);
deptVO.reset();
Row deptRow;
Row empRow;
// get the first emp row in the first department, mark the emp
// for termination by setting by setting empno = -1
deptVO.first();
empRow = empVO.first();
dataWriter.writeln("Employee to be terminated: "+
empRow.getAttribute("EmpName").toString());
empRow.setAttribute("EmpNum",new Integer(-1));
appModule.getTransaction().commit();
// Now purge all the Terminated emps
DeptVORowImpl dRow = (DeptVORowImpl)deptVO.first();
DeptImpl deptEO = dRow.getDeptUsage();
deptEO.purge();
appModule.getTransaction().commit();
closeWriter();
}