Sun Java System Application Server Enterprise Edition 8.2 アップグレードと移行

CMP エンティティー EJB の移行

ここでは、アプリケーションコンポーネントを EJB 1.1 アーキテクチャーから EJB 2.0 アーキテクチャーに移行する手順について説明します。

CMP 1.1 の Bean を CMP 2.0 に移行するには、まず、特定の Bean が移行可能かどうかを検証する必要があります。この検証作業は次の手順で実行します。

ProcedureBean を移行できるかどうか検証する

  1. ejb-jar.xml ファイルから <cmp-fields> 名に移動し、オプションのタグ <prim-key-field>ejb-jar.xml ファイル内に存在していて、指定された値が設定されているかどうかをチェックします。オプションのタグが存在し、値が設定されていれば、次の手順に進みます。

    ejb-jar.xml 内で <prim-key-class> のフィールド名を検索し、クラス名を取得して、そのクラス内で宣言されている public instance variables を取得します。次に、これらの変数の署名 (名前と大文字/小文字の区別) が上記の <cmp-field> 名に一致するかどうか確認します。見つかった変数を分離します。これらの分離されたフィールドで、大文字で始まっているものがないかどうかチェックします。ある場合は移行できません。

  2. Bean クラスのソースコードを調べて、すべての <cmp-field> 変数の Java の型を取得します。

  3. すべての <cmp-field> 名を小文字に変更し、これらの名前からアクセサを構築します。たとえば、元のフィールド名が Name で、その Java 型が String である場合、アクセス用メソッド署名は次のようになります。

    Public void setName(String name)Public String getName()

  4. これらのアクセス用メソッド署名を、Bean クラス内のメソッド署名と比較します。完全に一致する組み合わせが見つかった場合、移行は実行できません。

  5. カスタム検索メソッドの署名とそれに対応する SQL を取得します。SQL 内に Join、Outer join、または OrderBy が存在するかどうかチェックします。存在する場合は移行できません。EJB QL は Join、Outer join、orOrderBy をサポートしていないからです。

  6. java.util.Enumeration を使用していたすべての CMP 1.1 ファインダが、java.util.Collection を使用する必要があります。これを反映するようにコードを変更してください。CMP2.0 ファインダは java.util.Enumeration を返すことができません。

    実際の移行プロセスの実行方法については、「Bean クラスの移行」を参照してください。

Bean クラスの移行

ここでは、Bean クラスを Sun Java System Application Server 8.2 に移行するために必要な手順を説明します。

ProcedureBean クラスを移行する

  1. Bean クラス宣言の先頭にキーワード abstract を追加します。

    たとえば、Bean クラス宣言が次のような場合

    public class CabinBean implements EntityBean

    次のように変更します。

    abstract public class CabinBean implements EntityBean
  2. アクセサの前に接頭辞としてキーワード abstract を付けます。

  3. 変更後のすべてのアクセサを、Bean クラスのソース (.java) ファイルにクラスレベルで挿入します。

  4. Bean クラスのソースファイル内のすべての cmp フィールドをコメントにします。

  5. protected インスタンス変数の宣言を cmp-field 名から小文字で構築し、これをクラスレベルで挿入します。

  6. すべての ejbCreate() メソッド本体を読み込みます。複数の ejbCreate が存在する場合もあります。

    <cmp-field>=いくつかの値またはローカル変数」というパターンを検索し、「抽象ミュテータメソッド名 (同じ値またはローカル変数)」という表現に置き換えます。

    たとえば、移行前の ejbCreate 本体が次のような場合、

    public MyPK ejbCreate(int id, String name) {
       this.id = 10*id;
       Name = name;   //1
       return null;
    }

    次のように変更します。

    public MyPK ejbCreate(int id, String name) {
       setId(10*id);
       setName(name);   //1
       return null;
    }

    //1 の抽象アクセサのメソッド署名が、EJB 2.0 仕様によって定められた Camel Case 規約に沿っていることに注目してください。また、キーワード「this」が元のソースに存在する場合としない場合がありますが、これは変更後のソースファイルからは削除してください

  7. 手順 5 の ejbPostCreate() メソッドで宣言したすべての protected 変数を初期化します。

    protected 変数の数は ejbCreate() メソッドの数と同じです。この初期化は、初期化コードを次の方法で挿入することで実行されます。

    protected String name;  //from step 5
    protected int id;  //from step 5
    public void ejbPostCreate(int id, String name) {
       name = getName();    /*abstract accessor*/ //inserted in this step
       id  = getId();        /*abstract accessor*/ //inserted in this step
    }
  8. ejbLoad メソッド内部で、protected 変数を Bean のデータベース状態に設定します。

    このためには、次のコード行を挿入します。

    public void ejbLoad() {
       name = getName();    // inserted in this step
       id = getId();        // inserted in this step
       ...                  // existing code
    }
  9. 同じように、データベース状態が更新されるように、ejbStore() 内部の Bean の状態を更新します。

    ただし、ejbCreate() 外部の主キーに対応する setter を更新することはできないので、このメソッド内に setter を含めないでください。次のコード行を挿入します。

    public void ejbStore() {
        setName(name);       //inserted in this step
        setId(id);           //Do not insert this if
                             //it is a part of the
                             //primary key.
        ...                  //already present code
    }
  10. 存在するすべての <cmp-field> 変数名を、手順 5 で宣言した同等の protected 変数名に置き換えます。

    Bean を移行しない場合、少なくとも <cmp-version>1.x</cmp-version> タグを ejb-jar.xml ファイル内の適切な場所に挿入する必要があります。これによって、移行されていない Bean も Sun Java System Application Server 8.2 上で動作し続けます。

ejb-jar.xml の移行

ファイル ejb-jar.xml を Sun Java System Application Server 8.2 に移行するには、次の手順を実行します。

ProcedureEJB 配備記述子を移行する

EJB 配備記述子ファイル ejb-jar.xml を移行するには、ファイルを編集して次の変更を行います。

  1. すべての <cmp-fields> を小文字に変換します。

  2. <reentrant> タグの後に <abstract-schema-name> タグを挿入します。

    < ejb-name> タグ内と同じように、スキーマ名は Bean の名前になり、ias_ という接頭辞が付きます。

  3. 次のタグを <primkey-field> タグの後に挿入します。

    <security-identity>
       <use-caller-identity/>
    </security-identity>
  4. 上記で取得した SQL を使用して、SQL から EJB QL を構築します。

  5. <query> タグと、そこにネストされたすべての子タグを、すべての必要な情報とともに、<security-identity> タグのすぐ後に挿入します。

カスタム検索メソッド

カスタム検索メソッドは、デフォルトの findByPrimaryKey メソッドではなく、findBy メソッドです。このメソッドはエンティティー Bean のホームインタフェース内で定義することができます。EJB 1.1 仕様では、これらの検索メソッドのロジックを定義する標準が規定されていないため、EJB サーバーのベンダーは実装を自由に選択できます。この結果、メソッドの定義に使用される手順は、ベンダーの選択するさまざまな実装によって大きく異なっています。

Sun ONE Application Server 6.x では、標準の SQL を使用して検索ロジックを指定します。

この検索メソッドの定義に関する情報は、エンタープライズ Bean の持続性記述子 (Account-ias-cmp.xml) 内に、次のように格納されています。

<bean-property>
  <property>
    <name>findOrderedAccountsForCustomerSQL</name>
    <type>java.lang.String</type>
    <value>
       SELECT BRANCH_CODE,ACC_NO FROM ACCOUNT where CUST_NO = ?
    </value>
    <delimiter>,</delimiter>
  </property>
</bean-property>
<bean-property>
  <property>
    <name>findOrderedAccountsForCustomerParms</name>
    <type>java.lang.Vector</type>
    <value>CustNo</value>
    <delimiter>,</delimiter>
  </property>
</bean-property>

このように、各 findXXX 検索メソッドには、配備記述子内に対応する 2 つのエントリ (クエリー用の SQL コードと関連するパラメータ) が存在しています。

Sun Java System Application Server 8.2 ではカスタム検索メソッドのロジックも宣言型ですが、これは EJB QL (EJB query language) に基づいています。

EJB-QL 言語はそれ自身に対して使用することはできません。ファイル ejb-jar.xml にある <ejb-ql> タグ内で指定する必要があります。このタグは <query> タグの内部にあります。これは、EJB 内部でクエリー (検索または選択メソッド) を定義するタグです。EJB コンテナでは、各クエリーを検索または選択メソッドの実装に変換することができます。次に <ejb-ql> タグの例を示します。

<ejb-jar>   
  <enterprise-beans>     
    <entity>
      <ejb-name>hotelEJB</ejb-name>       
      ...       
      <abstract-schema-name>TMBankSchemaName</abstract-schema-name>       
      <cmp-field>
      ...       
      <query>         
        <query-method>           
          <method-name>findByCity</method-name> 
            <method-params>             
              <method-param>java.lang.String</method-param> 
            </method-params>         
        </query-method>         
        <ejb-ql>           
          <![CDATA[SELECT OBJECT(t) FROM TMBankSchemaName AS t 
                                         WHERE t.city = ?1]]>
        </ejb-ql>       
      </query>     
    </entity>   
    ...   
  </enterprise-beans> ... 
</ejb-jar>