• 検索結果がありません。

Access Beanでは、JavaBeansプログラミング・モデルにあわせてEnterprise Beanが調整さ

れ、ホームおよびリモート・インタフェースがAccess Beanユーザー(つまり、EJBクライ アントの開発者)から隠されます。これはIBM WebSphere環境固有のものです。これらの

Access Beanは、com.ibm.ivj.ejb.accessにパッケージ化されています。Access Bean

には、次の3種類があります。

Java Beanラッパー

これにより、Session BeanまたはEntity Beanを標準のJava Beanと同様の方法で使用 できるようになります。Enterprise Beanのホームおよびリモート・インタフェースは、

Access Beanユーザーから隠されます。Java Beanラッパーを作成すると、

com.ibm.ivj.ejb.access.AccessBeanクラスが拡張されます。

コピー・ヘルパー

コピー・ヘルパーはJava Beanラッパーに類似していますが、この中には、リモートの

Entity Beanからの属性のローカル・コピーを格納する、コピー・ヘルパー・オブジェ

クトが1つ組み込まれています。ユーザー・プログラムでは、Access Bean内のローカ ルにあるコピー・ヘルパー・オブジェクトからEntitiy Beanの属性を取得できるため、

リモートのEntity Beanの属性をアクセスする必要がなくなります。

行セット

行セットのAccess Beanは、Java Beanラッパーとコピー・ヘルパーの特徴をすべて兼 ね備えています。ただし、行セットには、単一のコピー・ヘルパー・オブジェクトでは なく、複数のコピー・ヘルパー・オブジェクトが組み込まれています。コピー・ヘル パー・オブジェクトは、それぞれ1つのEnterprise Beanインスタンスに対応します。

Enterprise Bean 間の関連 間の関連 間の関連 間の関連

WebSphereでは、CMP Beanに対して、1対1および1対多の関連をサポートしています。

生成されるコードは、WebSphereおよびVisualAge for Java環境固有のコードです。

EJB 1.1仕様では、アプリケーションでEJBExceptionをスローする必要がありますが、こ

れはWebSphere Advanced Edition 3.5.3ではまだ実装されていません。

EJB アプリケーションの アプリケーションの アプリケーションの アプリケーションの WebSphere から から から から OC4J への移行 への移行 への移行 への移行

WebSphereとOC4Jとの間では、EJBの次の4つの面において違いがあります。

EJBコード: 実際のBeanコード。これは主にEJB 1.0の仕様でよく定義されており、実装 間で互換性を維持する必要があります。一部の機能で、小さな例外がありますが、それ については後述します。

EJBのJava Archive(JAR): このファイルも標準に定義されています。これはバイナリ

標準となるよう(EJBの仕様に従って開発されたEJBのJARファイルがあらゆるEJBプ ラットフォームでデプロイ可能になるよう)設計されています。WebSphere 3.5では、

EJBのJARファイルが実装クラスとインタフェース・クラス、マニフェスト・ファイ ル、およびシリアライズされたデプロイメント・ディスクリプタ・ファイル(.ser)

で構成されます。

クライアント・コード: クライアント・コードは主に定義されており、一部の例外を除 いて実装間で互換性を維持します。デプロイ・プロセスはEJBの実装間で異なります。

デプロイ・プロセス: EJBのコードを取り出し、EJBのJARファイルとしてパッケージ化 します。また、特定のEJBコンテナでホスティングできるサポート・コード(スタブや タイなど)を作成し、それをサーバーにインストールします。最終的にJARファイルが デプロイされた時点では、ファイルに標準以外のコードが格納されます。デプロイ・プ ロセスの正確な定義については、ベンダーによって意見が異なります。

次の機能はOC4Jには移行できません。

Access Bean

WebSphereのObject Level Trace(OLT)パッケージ

EJB、JMSおよびMQ Series間のXAトランザクション

EJB のコード変更 のコード変更 のコード変更 のコード変更

一般に、EJB仕様のバージョン1.0に基づいて作成されたEnterprise Beanは、バージョン 1.1にほぼ適合します。しかし、次の場合は、Enterprise Beanのコードを変更または再コン パイルする必要があります。

トランザクションAPI固有の変更:

IBM固有のトランザクション・パッケージ

ユーザー・トランザクションに、次のIBM固有のトランザクション・サポート・パッ ケージをまだ使用しているEJBアプリケーション・コードは変更する必要があります。

そのためには、EJBソース・ファイル内で次の記述を含むimport文を探し、

import com.ibm.db2.jdbc.app.jta.javax.transaction.*

次のように変更します。

import javax.transaction.*

javax.jts.UserTransactionインタフェースを使用するBean

javax.jtsインタフェースのパッケージ名は、javax.transactionに変更されまし た。また、このインタフェースのメソッドによってスローされる例外にわずかな変更が あります。javax.jts.UserTransactionインタフェースを使用するEnterprise Beanは、javax.transaction.UserTransactionという新しい名前を使用するよ う変更される必要があります。

UserTransactionオブジェクトのルックアップ

EJB仕様のバージョン1.1に従って作成されたEnterprise Beanの場合、

UserTransactionオブジェクトの取得方法が異なります。WebSphereバージョン1.0 では、次のように取得されていました。

initialContext.lookup("jta/UserTransaction")

OC4Jでは、次のように変更してください。

initialContext.lookup("java:comp/UserTransaction")

javax.ejb.EJBContextインタフェースのgetCallerIdentity()、

isCallerInRole(Identity identity)またはgetEnvironment()メソッドを使 用しているBean

EJBContextクラスのこれらのメソッドの使用は、EJB 1.1では推奨されていません。

Java 2プラットフォームで、java.security.Identityクラスの使用が推奨されてい

ないためです。OC4Jでは、下位互換性のためにこれらのメソッドの実装を提供してい ますが、標準メソッドに移行することをお薦めします。

コンテナ管理の永続性を持つEntity Bean(再コンパイルする必要がある)

EJB 1.1とEJB 1.0との間では、ejbCreate()の戻り値が異なります。EJB 1.0仕様に

従って作成されたCMP Beanは、OC4Jでは再コンパイルしないと使用できません。EJB 1.0仕様では、ejbCreate()メソッドの戻り値がBMP Entity BeanとCMP Entity Bean で異なります。BMP Entity Beanでは、Bean Entityの一意のID(主キー)が返されま

す。CMP Entity Beanでは、voidが返されます。

次のコードは、EJB 1.0におけるコンテナ管理およびBean管理のejbCreate()メソッ ドで、異なるメソッド・シグネチャが使用されることを示しています。CMP Entity

Beanの場合

public class EmployeeCMP implements javax.ejb.EntityBean {

public int Empid;

public void ejbCreate(int empID) {

Empid= empID;

}

// more bean code follows ....

}

EJB 1.0のBMP Entity Beanの場合

public class EmployeeBMP implements javax.ejb.EntityBean 表表表

5-2 EJB 1.1の推奨されないメソッドの推奨されないメソッドの推奨されないメソッドの推奨されないメソッド メソッドメソッドメソッド

メソッド 新しいメソッド新しいメソッド新しいメソッド新しいメソッド 説明説明説明説明

getCallerIdentity() Principal getCallerPrincipal() getCallerIdentity()は、EJB 1.1で は推奨されていない。コンテナは、この メソッドから常にnullを返すことができ る。Enterprise Beanでは、このメソッド のかわりにgetCallerPrincipal() を使用する。

getEnvironment() JNDIネーミング・コンテキスト

java:comp/env

Enterprise Beanに環境プロパティが何も 設定されていない場合、このメソッドか らは空のjava.util.Propertiesオ ブジェクトが返される。このメソッドで nullが返されることはない。

CallerInRole(java.security.

Identityrole())

boolean isCallerInRole(String roleName)

{

Empid= empID;

// do a database insert using JDBC EmployeePK pk = new AccountPK(empID);

return pk;

}

// more bean code follows ...

}

EJB 1.1の仕様では、Bean管理のエンティティおよびコンテナ管理のエンティティのど

ちらでも、ejbCreate()メソッドから主キー型を返すように、変更が加えられていま す。しかし、コンテナ管理のBeanでは主キー・オブジェクトではなく、nullを返す必 要があります。

CMP EJBファインダ・メソッド

OC4Jサーバーでは、WebSphereのファインダ・ヘルパー・クラスとは対照的に、独自 の問合せ言語の形式を使用して、ファインダの問合せをXMLデプロイメント・ディス クリプタに組み込みます。CMP Entity Beanのデプロイ時には、ファインダ・ヘル パー・クラスを無視して問合せに置き換えることができます。その問合せは、OC4Jデ プロイメント・ディスクリプタorion-ejb-jar.xmlで、手動で編集します。たとえ

ば、WebSphere EJBの次のファインダ・ヘルパーをOC4Jに移行するには、次のように

します。

WebSphereの場合

public interface AccountBeanFinderHelper {

String findLargeAccountsQueryString ="select * from ejb.accountbeantbl where balance > ?";

}

この機能をOC4Jに移行するには、生成されたorion-ejb-jar.xmlの

<finder-method/>タグ・セクションで、次の変更を加えます。

public static final String findByOwner_query="full: select "+

"*"+"from from ejb.accountbeantbl"+ "where balance >$1";

この問合せでは、最初にfull:を指定して、これが問合せの全文であることを指定し ています。

Entity Beanの読取り専用メソッド

前述のとおり、WebSphere Administrative Consoleには、特定のメソッドが読取り専用 であることをEJBコンテナに指示するオプションが備わっています。OC4Jでは、ラン タイム方式で同様の機能を利用できます。読取り専用メソッドを持つEJBを移行する手 順は次のとおりです。

1. Beanコードで、public boolean isModified()メソッドを定義します。

2. Beanが変更されるたびに設定されるブール・フラグがこのメソッドから返される ようにします。このフラグは、ejbStore()で消去します。

isModified()からfalseが返されると、OC4Jはデータベースへの接続が不要で あることを認識します。

クライアント・レベルのコード変更 クライアント・レベルのコード変更 クライアント・レベルのコード変更 クライアント・レベルのコード変更

次のコード変更を行う必要があります。

クライアント管理のトランザクション: EJBプログラミング・モデルでは、クライアン ト・アプリケーションとEnterprise Beanで、関連するメソッド起動をバインドして1 つの基本作業単位にまとめるトランザクションを作成する

(javax.jts.UserTransactionインタフェースを使用して)ことができます。しか し、EJBの仕様では、クライアント・アプリケーションによるトランザクションの作成 方法は定義しておらず、クライアント・アプリケーションによる

javax.jts.UserTransactionインタフェースの参照の取得方法も指定していませ ん。そのかわり、アプリケーション・サーバーでは、JTS CosTransactionsへのアク セスに使用できるクラスを提供しています。これは現行インタフェースであり、

javax.jts.UserTransactionインタフェースのスーパーセットでもあります。この インタフェースを使用すると、トランザクションの作成、一時停止と再開、コミットま たは強制終了が実行できます。org.omg.CosTransactions.Currentインタフェー スの参照を取得するには、クライアント・アプリケーションで

com.ibm.ejs.client.EJClientクラスの静的メソッドgetCurrent()をコールす るだけで済みます。次に例を示します。

org.omg.CosTransactions.Current current

=com.ibm.ejs.client.EJClient.getCurrent();

current.begin();

// do transactional work current.commit(false);

OC4Jでは、クライアント管理のトランザクションをサポートしていません。クライア ント管理のトランザクションをコンテナ管理のトランザクションとしてデプロイするに は、EJBデプロイメント・ディスクリプタのトランザクション・プロパティを変更しま す。