このトピックには、以下のセクションが含まれています。
必要な個所では、EJB ファクトリーとデータ・クラスを、 引き続きオリジナルの設計を使用している Java™ Bean ラッパーとコピー・ヘルパーと比較しています。
EJB ファクトリーを使用してエンタープライズ Bean のインスタンスを生成する方法を説明するために、 MyEJB という名前の既存のエンティティー Bean を所有していることを想定します。 MyEJBAccessBean が作成されると、デフォルト・コンストラクターは findByPrimaryKey(MyEJBKey) にマップされます。 MyEJBKey には、lastName という名前の単一ストリング・フィールドがあります。
MyEJBAccessBean ab = new MyEJBAccessBean(); // maps to
findByPrimaryKey(MyEJBKey);
ab.setInitKey_lastName = "stokes";
int i = ab.getAnInt(); // <- findByPrimaryKey(MyEJBKey) occurs here
...
MyEJBFactory factory = new MyEJBFactory();
MyEJB myEjb = factory.findByPrimaryKey(new MyEJBKey("stokes"));
int i = myEjb.getAnInt();
...
MyEJBFactory factory = new MyEJBFactory();
MyEJBKey key = new MyEJBKey("stokes");
MyEJB myEjb = factory.findByPrimaryKey(key);
int i = myEjb.getAnInt();
...
MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- create occurs here
ab.setAnInt(5);
...
MyEJBFactory factory = new MyEJBFactory();
MyEJB myEjb = factory.create("stokes");
myEjb.setAnInt(5);
...
MyEJB myEjb = new MyEJBFactory.create("stokes");
myEjb.setAnInt(5);
...
MyEJBAccessBean ab = new MyEJBAccessBean(); // maps to create(String);
ab.setInit_argKey = "stokes";
int i = ab.getAnInt(); // <- create(String) occurs here
...
MyEJBFactory factory = new MyEJBFactory();
MyEJB myEjb = factory.create("stokes");
int i = myEjb.getAnInt();
...
MyEJBAccessBean ab = new MyEJBAccessBean(); // maps to
findByPrimaryKey();
ab.setInit_NameServiceTypeName("com.ibm...CNInitialContextFactory");
ab.setInit_NameServiceURLName("IIOP://9.21.35.100:900");
ab.setInitKey_lastName = "stokes";
int i = ab.getAnInt(); // <- findByPrimaryKey() occurs here
...
新規の設計では、同じコードをほぼ同じ方法で作成できます。 MyEJBFactory factory = new MyEJBFactory();
factory.setInitialContextFactoryName("com.ibm...CNInitialContextFactory");
factory.setInitialNameServiceProviderURL("IIOP://9.21.35.100:900");
MyEJB myEjb = factory.findByPrimaryKey(new MyEJBKey("stokes"));
int i = myEjb.getAnInt();
...
ただし、デフォルト・コンストラクター (この場合は findByPrimaryKey)
へマップされたもの以外のホーム・インターフェース・メソッドを使用する場合は、
オリジナルの設計では、以下のようなコードを使用することはできません。 MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- create() occurs here
// The following two lines have no effect, because the home is already acquired
ab.setInit_NameServiceTypeName("com.ibm...CNInitialContextFactory");
ab.setInit_NameServiceURLName("IIOP://9.21.35.100:900");
int i = ab.getAnInt();
...
上記の代わりに、以下のコードを使用する必要があります。 //The following two lines call static setters on the AbstractAccessBean class
MyEJBAccessBean.setInit_GlobalNameServiceTypeName("com.ibm...CNInitialContextFactory");
MyEJBAccessBean.setInit_GlobalNameServiceURLName("IIOP://9.21.35.100:900");
MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- create() occurs here
int i = ab.getAnInt();
...
ただし、このコードはスレッド・セーフではありません。このスレッドがコンストラクター呼び出しの直前に割り込みされ、別のスレッドがこれらのグローバル値を別の値に設定すると、アクセス Bean は設定されているネーム・サービスを参照します。新規の設計では、以下のようなコードを使用します。
MyEJBFactory factory = new MyEJBFactory();
factory.setInitialContextFactoryName("com.ibm...WsnInitialContextFactory");
factory.setInitialNameServiceProviderURL("IIOP://9.21.35.100:900");
MyEJB myEjb = factory.create("stokes");
int i = myEjb.getAnInt();
...
MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- maps to
find(String)
ab.setAnInt(5);
ab.setAString("xxx");
...
ab.commitCopyHelper();
新規の設計では、キャッシュ可能なプロパティーは、MyEJBData など、別のオブジェクト内に保管されます。 この場合、コピー・ヘルパー用に作成されたコードは、以下のようになります。
MyEJBData data = new MyEJBData();
data.setAnInt(5);
data.setAString("xxx");
...
MyEJB myEjb = new MyEJBFactory().find("stokes");
myEjb.setMyEJBData(data);
コピー・ヘルパー・アクセス Bean を使用していくつかのプロパティーを取得する場合は、以下のコードに類似したコードを作成します。
MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- maps to
find(String)
int i = ab.getAnInt();
String s = ab.getAString();
...
新規の設計では、コードは以下のように作成します。
MyEJB myEjb = new MyEJBFactory().find("stokes");
MyEJBData data = myEjb.getMyEJBData();
int i = data.getAnInt();
String s = data.getAString();
...
MyEJBAccessBean ab = new MyEJBAccessBean(); // maps to
findByPrimaryKey(MyEJBKey);
ab.setInitKey_lastName = "stokes";
try {
int i = ab.getAnInt(); // <- findByPrimaryKey(MyEJBKey) occurs here
...
} catch (NamingException nameExc) {
...
} catch (FinderException finderExc) {
...
} catch (CreateException createExc) {
...
} catch (RemoteException remoteExc) {
...
} // endtry
新規の設計では、同じコードを以下のように作成します。
MyEJBFactory factory = new MyEJBFactory();
try {
MyEJB myEjb = factory.findByPrimaryKey(new
MyEJBKey("stokes"));
int i = myEjb.getAnInt();
...
} catch (FinderException finderExc) {
...
} catch (RemoteException remoteExc) {
...
} // endtry