Entity Beanのインスタンスを検索するときのEntity Beanを呼び出すアプリケーション、コンテナおよびEnterprise Beanクラス間の処理の流れとEntity Beanを呼び出すアプリケーションの記述例について説明します。
処理の流れ
Entity Beanのインスタンスを検索しデータを取り出すときの処理の流れを示します。
以下の例はBMPのEntity Beanです。CMPはデータベースアクセス処理をコンテナが行いますが、処理の流れは同じです。

呼出し元のアプリケーションから、findkey1メソッドを呼び出します。
findkey1メソッドが発行されると、コンテナからEnterprise BeanクラスのejbFindKey1メソッドが呼び出されて、ejbFindKey1に記述したSELECT文を実行し、プライマリキーオブジェクトを作成、返却します。
呼出し元のアプリケーションから、ビジネスメソッド(getNameメソッド)を呼び出します。
ビジネスメソッドが呼び出されると、コンテナが以下の処理を行います。
Enterprise BeanクラスのejbActivateメソッドを呼び出す。
Enterprise BeanクラスのejbLoadメソッドを呼び出す。ejbLoadメソッドに記述したSELECT文が実行され、永続化フィールドにデータを設定する。
Enterprise Beanクラスのビジネスメソッドを呼び出す。
1件インスタンス検索の記述例
呼び出すEntity Beanのlookup処理を行い、Entity BeanのEJB homeを取得する。
findByPrimaryKeyメソッドを呼び出し、プライマリキーオブジェクトを取得する。
ビジネスメソッドを呼び出す。
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 インタフェースの場合)
呼び出すEntity Beanのlookup処理を行い、EJB homeを取得する。
find<METHOD>メソッドを呼び出し、プライマリキーオブジェクトを取得する。
ビジネスメソッドを呼び出す。
(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 インタフェースの場合)
呼び出すEntity Beanのlookup処理を行い、EJB homeを取得する。
find<METHOD>メソッドを呼び出し、プライマリキーオブジェクトを取得する。
ビジネスメソッドを呼び出す。
(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;
:
}