このトピックには、以下のセクションが含まれています。
必要な個所では、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