行レベルの検証の実装

行レベルの検証は、複数の属性を同時に検証する必要がある場合に便利です。この種類の検証は、EntityImpl.validateEntity()をオーバーライドすることで、エンティティ・レベルで実装します。

validateEntity()は、エンティティ・オブジェクトのインスタンスの選択が解除される(クライアントが特定の行の参照を終了する)、またはクライアントがトランザクションをコミットしようとするたびにコールされます。validateEntity()が例外をスローする場合は、エラーが修正されるまで、エンティティ・オブジェクトの選択は解除されません。

行レベルの検証を実装するには、次のようにします。

  1. ナビゲータで、エンティティ・オブジェクトを右クリックし、「<オブジェクト名>の編集」を選択します。
    エンティティ・オブジェクト・エディタが開きます。
  2. エンティティ・オブジェクト・エディタの左側のペインで、「Java」ノードを選択します。
  3. Javaページで、「検証メソッド」チェック・ボックスをチェックします。
  4. 「OK」をクリックし、エディタを閉じます。
  5. ナビゲータで、エンティティ・オブジェクトを右クリックし、「エンティティ・オブジェクト・クラスに移動」を選択します。
    Javaソース・エディタが開きます。
  6. Javaソース・エディタを使用し、super.validateEntity()メソッドの後にカスタム・コードを追加します。

たとえば、人事管理アプリケーションの場合、Employeeエンティティ・オブジェクトは、DateHired属性とYearsOfService属性間の関係が有効な場合にのみ有効です。検証規則により、他のエンティティからの値も評価できます。次のコード例では、マスター/ディテール・アソシエーションで結合されたEmpエンティティ・オブジェクトとDeptエンティティ・オブジェクトからの値を評価します。

public void validateEntity() {
  super.validateEntity();

  // Custom validation follows: 
  // Employees in ACCOUNTING cannot have Salary > 1500.
  if (this.getDept().getDname().equals("ACCOUNTING") &&
    (this.getSal().compareTo(1500) > 0) {
	  throw new JboException("Salary too high for ACCOUNTING.");
  }
}    

検証ロジックの実装