ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド

15.2.2 検索処理の記述

Entity Beanのインスタンスを検索するときのEntity Beanを呼び出すアプリケーション、コンテナおよびEnterprise Beanクラス間の処理の流れとEntity Beanを呼び出すアプリケーションの記述例について説明します。

処理の流れ

Entity Beanのインスタンスを検索しデータを取り出すときの処理の流れを示します。
以下の例はBMPのEntity Beanです。CMPはデータベースアクセス処理をコンテナが行いますが、処理の流れは同じです。



  1. 呼出し元のアプリケーションから、findkey1メソッドを呼び出します。
    findkey1メソッドが発行されると、コンテナからEnterprise BeanクラスのejbFindKey1メソッドが呼び出されて、ejbFindKey1に記述したSELECT文を実行し、プライマリキーオブジェクトを作成、返却します。

  2. 呼出し元のアプリケーションから、ビジネスメソッド(getNameメソッド)を呼び出します。
    ビジネスメソッドが呼び出されると、コンテナが以下の処理を行います。

    • Enterprise BeanクラスのejbActivateメソッドを呼び出す。

    • Enterprise BeanクラスのejbLoadメソッドを呼び出す。ejbLoadメソッドに記述したSELECT文が実行され、永続化フィールドにデータを設定する。

    • Enterprise Beanクラスのビジネスメソッドを呼び出す。

1件インスタンス検索の記述例

記述する処理概要
  1. 呼び出すEntity Beanのlookup処理を行い、Entity BeanのEJB homeを取得する。

  2. findByPrimaryKeyメソッドを呼び出し、プライマリキーオブジェクトを取得する。

  3. ビジネスメソッドを呼び出す。

記述例

EmployeeEVは、1レコード分のデータを格納するためのユーザ定義クラスを表しています。

       (lookup処理でEJB homeの取得)
                                   :
    EmployeeEntityRemote etyRemote = null;
    EmployeeEntityPrimaryKey pk = new EmployeeEntityPrimaryKey();
    pk.ID = empEV.getId();

    try {
        // findByPrimaryKeyの呼出し
        etyRemote = etyHome.findByPrimaryKey(pk);
    } catch ( FinderException ex ) {
        throw new UserException( ex.getMessage() );
    } catch ( RemoteException ex ) {
        throw new EJBException( ex.getMessage() );
    }
    EmployeeEV view = new EmployeeEV();
    // ビジネスメソッド/抽象アクセッサメソッド(getId,getName,getDept,getAge)の呼出し
    view.setId(etyRemote.getId());
    view.setName(etyRemote.getName());
    view.setDept(etyRemote.getDept());
    view.setAge(etyRemote.getAge());

                                   :

複数インスタンス検索の記述例(collection インタフェースの場合)

記述する処理概要
  1. 呼び出すEntity Beanのlookup処理を行い、EJB homeを取得する。

  2. find<METHOD>メソッドを呼び出し、プライマリキーオブジェクトを取得する。

  3. ビジネスメソッドを呼び出す。

記述例
       (lookup処理でEJB homeの取得)
                                   :
    Collection enum = null;
    try {
        // find<METHOD>の呼出し
        enum = etyHome.findByKey2(empEV);
    } catch ( FinderException ex ) {
        throw new UserException( ex.getMessage() );
    } catch ( RemoteException ex ) {
        throw new EJBException( ex.getMessage() );
    }

    if ( enum == null ) {
        examDebug( "## EmployeeCBM : empSearchN2() record not found" );
        return null;
    }

    int count = 0;
    Vector vec = new Vector();
    EmployeeEntityRemote etyRemote = null;
    Iterator iterator = enum.iterator();

    java.lang.Object obj = null;
    while( iterator.hasNext() ) {
        EmployeeEV view = new EmployeeEV();
        obj = iterator.next();
        etyRemote =
            (EmployeeEntityRemote)javax.rmi.PortableRemoteObject.narrow(obj,
            EmployeeEntityRemote.class);
        // ビジネスメソッド/抽象アクセッサメソッド(getId,getName,getDept,getAge)の呼出し
        view.setId(etyRemote.getId());
        view.setName(etyRemote.getName());
        view.setDept(etyRemote.getDept());
        view.setAge(etyRemote.getAge());
        count++;
        vec.addElement( view );
    }

                                   :

注意

以下の[条件]に当てはまらない場合、finderメソッドから返却されるCollectionインタフェースで、以下の[使用できないメソッド]は使用できません。使用した場合には、java.lang.UnsupportedOperationExceptionが返却されます。

条件

  • CMP1.1およびBMPの場合
    IJServerタイプ別に以下のように異なります。以下の条件を満たさない場合、使用範囲はV6.0以前の範囲となります。

    • WebアプリケーションとEJBアプリケーションを同一JavaVMで運用
      トランザクション属性に“Mandatory”以外のトランザクション属性を指定してください。

    • WebアプリケーションとEJBアプリケーションを別JavaVMで運用または、EJBアプリケーションのみ運用
      トランザクション属性に“Mandatory”以外のトランザクション属性を指定するか、トランザクション属性に“Mandatory”を指定する場合は、Interstage管理コンソールの[アプリケーション環境定]で、“ローカル呼出し”に“しない”を設定してください。

  • CMP2.0の場合、条件はありません。

使用できないメソッド

  • add(Object o)

  • addAll(Collection c)

  • clear()

  • contains(Object o)

  • containsAll(Collection c)

  • remove(Object o)

  • removeAll(Collection c)

  • retainAll(Collection c)

  • size()

  • toArray()

  • toArray(Object[] a)

  • 同一Collectionに対してiterator()メソッドを2回以上実行する

トランザクション属性の設定について詳細は、“10.4.1 トランザクション管理種別とトランザクション属性”を参照してください。


また、sizeメソッドについては以下の場合には使用できません。使用した場合にはjava.lang.UnsupportedOperationExceptionが返却されます。

  • インスタンス管理モードにSequentialを指定している場合

  • Interstage V3の処理モードを指定している場合

  • Interstage V3以前で配備したEJBアプリケーションを使用している場合

複数インスタンス検索の記述例(enumeration インタフェースの場合)

記述する処理概要
  1. 呼び出すEntity Beanのlookup処理を行い、EJB homeを取得する。

  2. find<METHOD>メソッドを呼び出し、プライマリキーオブジェクトを取得する。

  3. ビジネスメソッドを呼び出す。

記述例
       (lookup処理でEJB homeの取得)
                                   :
    Enumeration enum = null;
    try {
        // find<METHOD>の呼出し
        enum = etyHome.findByKey(empEV);
    } catch ( FinderException ex ) {
        throw new UserException( ex.getMessage() );
    } catch ( RemoteException ex ) {
        throw new EJBException( ex.getMessage() );
    }

    if ( enum == null ) {
        examDebug( "## EmployeeCBM : empSearchN() record not found" );
        return null;
    }

    int count = 0;
    Vector vec = new Vector();
    EmployeeEntityRemote etyRemote = null;
    java.lang.Object obj = null;
    while( enum.hasMoreElements() ) {
        EmployeeEV view = new EmployeeEV();
        obj = enum.nextElement();
        etyRemote =
            (EmployeeEntityRemote)javax.rmi.PortableRemoteObject.narrow(obj,
                EmployeeEntityRemote.class);
        // ビジネスメソッド/抽象アクセッサメソッド(getId,getName,getDept,getAge)の呼出し
        view.setId(etyRemote.getId());
        view.setName(etyRemote.getName());
        view.setDept(etyRemote.getDept());
        view.setAge(etyRemote.getAge());
        count++;
        vec.addElement( view );
     }

                                   :

ejbSelectメソッドの記述例

記述する処理概要

EntityBeanメソッド内よりejbSelectメソッドを呼び出します。クライアントアプリケーション、または、他のEJBアプリケーション内からejbSelectメソッドへアクセスできません。

記述例

以下にビジネスメソッド内からejbSelectメソッドを使用したCMP2.0のEnterprise Beanの記述例を示します。

  public abstract class OrderBean implements javax.ejb.EntityBean {

                                  :

    public int getSameDayOrderCount() {
      Collection c;
      try {
        // ejbSelectメソッドの呼出し
        c = ejbSelectOrdersOn(getDate());
      } catch (FinderException fe) {
        fe.printStackTrace();
        return 0;
      }
      return c.size();
    }

                                  :
    // ejbSelectメソッドをabstractで宣言
    public abstract java.util.Collection ejbSelectOrdersOn(java.lang.String date) 
                                               throws javax.ejb.FinderException;
                                  :
  }