ビュー・リンクのエンティティ・オブジェクトへの公開

JDeveloperでは、ビュー・リンクにより定義された関係を使用して、複数のエンティティ・オブジェクトにアクセスして得られる結果を定義できます。JDeveloperでは、ビュー・リンクにより返されるデータへの容易なアクセスを提供するメソッドをエンティティ・オブジェクト内に作成することで、これを行います。

このトピックでは、ビュー・リンクをエンティティ・オブジェクトに公開する例を示します。

データベースから、特定の部門の退職した従業員のレコードを削除するビジネス・ロジックを記述するとします。データベースでは、退職した従業員は負の従業員番号で表されているとします。ビュー・リンクを使用し、従業員番号が負である行のみを返すアクセッサ・メソッドを作成できます。これには、ビュー・リンク・ウィザードを使用し、リンク元およびリンク先のビュー・オブジェクト、アクセッサ・メソッドの名前、リンク元およびリンク先のロール属性および必要なデータを返すSQL文を指定します。

Deptエンティティ・オブジェクトとEmpエンティティ・オブジェクト、DeptViewビュー・オブジェクトとEmpViewビュー・オブジェクトを含むプロジェクトがすでにある場合は、次の手順に従い、ビュー・リンクをエンティティ・オブジェクトに公開できます。

  1. ナビゲータでビジネス・コンポーネント・パッケージを右クリックし、「新規ビュー・リンク」を選択してビュー・リンク・ウィザードを開きます。

  2. 「初期画面」ページが表示されたら、「次へ」をクリックします。

  3. 「名前」ページで、ビュー・リンクの名前をDeptToEmpVLとします。「次へ」をクリックします。

  4. 「ビュー・オブジェクト」ページで、リンク元ビューとして「DeptView」を、リンク先ビューとして「EmpView」を選択します。「次へ」をクリックします。

  5. 「リンク元の属性」および「リンク先の属性」ページで、「Deptno」を選択します。「次へ」をクリックします。

  6. 「SQL設定」ページで、AND Emp.Empno<0を「WHERE」フィールドに追加します。この結果、問合せ文は、Dept.DEPTNO = Emp.DEPTNO AND Emp.Empno<0となります。「次へ」をクリックします。

  7. 「ビュー・リンク・プロパティ」ページで、「アクセッサの生成」「エンティティ・アクセッサ」を選択し、TerminatedEmpsを「アクセッサ名」フィールドに入力します。「次へ」をクリックします。

  8. 「終了」をクリックすると、ビュー・リンクが生成されます。

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();
}


関連項目
ビュー・リンクのエンティティ・オブジェクトへの公開について