EJB ファクトリーおよびデータ・クラス

EJB ファクトリーとデータ・クラス・アクセス Bean は、ワークベンチで使用される新設計アクセス Bean の典型です。

このトピックには、以下のセクションが含まれています。

必要な個所では、EJB ファクトリーとデータ・クラスを、 引き続きオリジナルの設計を使用している Java™ Bean ラッパーとコピー・ヘルパーと比較しています。

EJB ファクトリーを使用してエンタープライズ Bean のインスタンスを作成

EJB ファクトリーを使用してエンタープライズ Bean のインスタンスを生成する方法を説明するために、 MyEJB という名前の既存のエンティティー Bean を所有していることを想定します。 MyEJBAccessBean が作成されると、デフォルト・コンストラクターは findByPrimaryKey(MyEJBKey) にマップされます。 MyEJBKey には、lastName という名前の単一ストリング・フィールドがあります。

オリジナルのアクセス Bean 設計では、以下の方法でアクセス Bean のインスタンスを使用することができます。
   MyEJBAccessBean ab = new MyEJBAccessBean(); // maps to
     findByPrimaryKey(MyEJBKey);
     ab.setInitKey_lastName = "stokes";
     int i = ab.getAnInt(); // <- findByPrimaryKey(MyEJBKey) occurs here
     ...
新規のアクセス Bean 設計では、以下のように、まったく同じ方法でコードを作成することができます。
   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);
     ...
MyAccessBean が create(String) をデフォルトのホーム・インターフェース・メソッドとして使用した場合は、 オリジナルの設計では、以下の方法でアクセス Bean のインスタンスを構成することができます。
   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();
     ...

EJB ファクトリーを使用してのコンテキスト・ファクトリーおよびプロバイダー URL の設定

現行のシステム・プロパティーの設定が、 参照しているネーミング・コンテキスト以外のネーミング・コンテキストへの参照が必要であることを想定します。 引数のないコンストラクターを findByPrimaryKey() へマップしてある場合は、 オリジナルの設計では、以下のコードを使用します。
   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();
     ...

データ・クラスを使用するキャッシュ・オペレーション

コピー・ヘルパー・アクセス Bean を使用していくつかのプロパティーを設定する場合は、以下のコードを使用します。
   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();
     ...

例外処理

オリジナルの設計では、findByPrimaryKey へマップされているデフォルト・コンストラクターで MyEJBAccessBean を作成した場合、クライアント・コードは以下のフラグメントのようなものになります。
   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

フィードバック