EJB 2.xをEJB 3.0と相互運用する方法

日付:2006年6月16日
著者:Debu Panda

はじめに

このサンプル・アプリケーションでは、EJB 2.xとEJB 3.0の相互運用性、特にEJB 2.x APIで作成したステートレスSession BeanからEJB 3.0永続化APIを使用する方法について説明します。

EJB 3.0の使用には、次の環境が必要です。

  • EJB 2.x BeanからEJB 3.0永続化APIへのアクセス
  • EJB 3.0 APIを使用したEJBからの2.x SessionおよびEntity Beanを使用するEJBへのアクセス

相互運用性の実証のため、ここでは MySessionEJB(EJB 2.x Session Bean)を例に、EJB 3.0永続化APIを使用して Employee Entity Beanを作成する方法について説明します。

EJB 3.0によるEntity Beanの例

ここでは、EJB 3.0 Entity Beanを例に説明します。

@Entity
@Table(name = "EMP")
public class Employee implements java.io.Serializable
{
  private int empNo;
  private String eName;

  private double sal;
  @Id
  @Column(name="EMPNO")
  public int getEmpNo()
  {
    return empNo;
  }

..

}

EJB 2.xステートレスSession BeanからのEntityManager APIの使用

Entity Beanインスタンスの作成、検索、更新には、 javax.persistence.EntityManager APIを使用します。 MySessionEJBステートレスSession Beanは、EntityManager APIを使用して Employee Beanインスタンスを作成します。 ステートレスEJBは、JNDIルックアップを作成してEntityManagerのインスタンスを取得し、EntityManagerインスタンスの persistメソッドを使用してEJB 3.0 Entity Beanオブジェクトを作成します。

public class MySessionEJBBean implements SessionBean 
{
  
  public void addEmployee(int empNo, String eName, double sal)

  {
    Employee emp=null;      

    try 
    {
      Context ctx = new InitialContext();
       
                                    
EntityManager em = (EntityManager) ctx.lookup("java:comp/env/HowToEntityManager");
             
       if (emp == null) emp = new Employee();
        emp.setEmpNo(empNo);
        emp.setEname(eName); 
        emp.setSal(sal);
        em.persist(emp);
                
    }
    catch (Exception ex) 
    {
      ex.printStackTrace();
      System.out.println("Lookup failed");
    } 
        
    
  }

  public void ejbCreate()
  {
  }

..
}
                                  

このリリースは、persistence-context-refを使用してENCで使用可能なEntityManagerを作成するものです。EJB 2.xのBeanをEJB 3.0のBeanやエンティティとパッケージ化する場合は、次のようにデプロイメント・ディスクリプタのejb-jarタグで、version="3.0"と指定する必要があります。



                                 

<ejb-jar version="3.0">
<enterprise-beans>
<session>
<ejb-name>MySessionEJB</ejb-name>
..

<persistence-context-ref>
<persistence-context-ref-name>howto/EntityManager</persistence-context-ref-name>
<persistence-unit-name>howto</persistence-unit-name>
</persistence-context-ref>
</session>
</enterprise-beans>



                                 

前提条件

必須知識

アプリケーションのサンプルを完了させるには、以下を熟知している必要があります。
  • EJB 2.1
  • EJB 3.0

EJB 3.0の詳細は、OTNの次のドキュメントを参照してください。

ソフトウェア要件

このデモンストレーションでは、次のソフトウェア・コンポーネントがインストールされ、正しく構成されている必要があります。

表記法

  • %ORACLE_HOME% - OracleのEJB 3.0コンテナをインストールしたディレクトリ
  • %JAVA_HOME% - 使用するJDKがインストールされているディレクトリ
  • %HOWTO_HOME% - デモンストレーションを解凍したディレクトリ

アプリケーションの構築

このアプリケーションのJavadoc は、 %HOWTO_HOME%/doc/javadoc/ディレクトリにあります。

構成ファイルは %HOWTO_HOME%/etcディレクトリにあり、application.xmlなどのデプロイメント・ディスクリプタ・ファイルが含まれます。

アプリケーションの実行

Oracle Application Server 10g 10.1.3.1のスタンドアロンのインスタンスでアプリケーションのサンプルを実行するには、次の手順に従ってください。

1. サンプルのファイル・ディレクトリの検証

  • build - ビルド時に作成される一時ディレクトリ
  • log - ビルド/デプロイのログを保持する一時ディレクトリ
  • etc - アプリケーションのパッケージ化に必要なすべてのファイル
  • lib - デプロイ可能なアプリケーション・アーカイブを保持
  • scripts - 表を作成するためのSQL文を含む
  • doc - How-ToドキュメントとJavadoc
    • javadoc - 異なるソース・ファイルのJavadoc
    • how-to-ejb30-interoperability.html - このWebサイト
  • src - デモンストレーションのソース
    • ejb - ステートレスSession Beanのサンプル・コードの格納先
    • client - アプリケーションのクライアント・コードの格納先

2. 環境の設定

次の環境変数が定義されていることを確認してください。

  • %ORACLE_HOME% - Oracle Containers for J2EE(OC4J)がインストールされているディレクトリ
  • %JAVA_HOME% - J2SE 5.0がインストールされているディレクトリ
  • %PATH% - %ORACLE_HOME% /ant/binを含む

データベースの構成

このサンプルには、OracleデータベースのSCOTTスキーマの EMP表が必要です。 OracleデータベースにSCOTTスキーマがインストールされていない場合、またはOracle以外のデータベースを使用している場合は、 %HOWTO_HOME%/scriptsディレクトリの table.sqlを使用して、データベース表を作成します。

データソースの設定

このサンプルでは、EMP表を含むデータベースに接続するため、DataSourceを設定する必要があります。 そのため、次のように、 %ORACLE_HOME%/j2ee/home/config/data-sources.xmlを、EMP表を所有するスキーマに設定する必要があります。

<connection-pool name="Example Connection Pool">
<!-- This is an example of a connection factory that emulates XA behavior. -->
<connection-factory factory-class="oracle.jdbc.pool.OracleDataSource"
user="scott"
password="tiger"
url="jdbc:oracle:thin:@localhost:1521:ORCL">
</connection-factory>
</connection-pool>

<managed-data-source name="OracleManagedDS"
connection-pool-name="Example Connection Pool"
jndi-name="jdbc/OracleDS"/>
 

3. サーバーの起動

上記を変更した後に、次のコマンドを使用してOracle Containers for J2EE(OC4J)をスタンドアロンで起動します。

>%ORACLE_HOME%/bin/oc4j -start

Oracle Application Server管理インストールを使用している場合、上記の変更後に次のコマンドを使用します。

> %ORACLE_HOME%/opmn/bin/opmnctl startall

4. アプリケーションの生成、コンパイル、およびデプロイ

Ant 1.6.2はOracle Containers for J2EE(OC4J)に同梱されており、 PATH環境変数を $ORACLE_HOME/ant/binに設定する必要があります。 オペレーティング・システムによっては、現在はAntが環境変数をサポートしていないものがあります。 該当するオペレーティング・システムの場合は、 %HOWTO_HOME% ディレクトリにあるant-oracle.xmlを修正してください。

demo directoryのant-oracle.propertiesを編集し、 次のOracle Containers for J2EE(OC4J)スタンドアロンで示されているとおりに、プロパティに正しい値が設定されていることを確認してください。

  • oc4j.host: Oracle Containers for J2EE(OC4J)が稼働しているホスト (デフォルトはlocalhost)
  • oc4j.admin.port: RMIポート番号(デフォルトは23791)
  • oc4j.admin.user: 管理ユーザー名(デフォルトはoc4jadmin)
  • oc4j.admin.password: 管理ユーザーのパスワード(デフォルトはwelcome)
  • oc4j.binding.module: デプロイしたWebモジュールがあるWebサイト名(デフォルトはhttp-web-site)

Oracle Application Server管理インストールを使用している場合、Oracle Application Serverインストールで管理されているOracle Containers for J2EE(OC4J)インスタンスの oc4j.admin.userおよび oc4j.admin.password以外の変更については、次のプロパティを変更します。

  • opmn.host: Oracle Application Serverが稼働しているhostname/IP (デフォルトはlocalhost)
  • opmn.port: Oracle Application Serverインストール時のOPMNリクエスト・ポート(デフォルトは6003)
  • oc4j.instance: 管理ユーザー名(デフォルトはoc4jadmin)

環境に応じて、ant-oracle.propertiesのdeployer.uriを適切にコメントアウトする必要があります。たとえば、OPMNの管理する単一のOracle Containers for J2EE(OC4J)インスタンスやクラスタ化されたOC4Jインスタンス/グループなどです。

環境に合わせて、 jndi.propertiesのprovider.url、principalおよびcredentialの変更が必要です。 Oracle Application Server管理インストールを使用している場合は、provider.urlを次の形式で使用してください。 opmn:ormi://localhost:6003:home/ejb30interoperejb2x.

アプリケーションを構築するには、 %HOWTO_HOME%ディレクトリで次のコマンドを入力します。

>ant

これで、 %HOWTO_HOME%/libディレクトリ内に ejb30interopejb2x.earが新しく作成されます。

構築に成功すると、このコマンドはアプリケーションをデプロイするよう試みます。 まず、OC4Jが稼働しているかをテストします。

アプリケーションは、別々にデプロイすることもできます。 %ORACLE_HOME%の環境変数が定義されていることを確認したら、 %HOWTO_HOME%ディレクトリから次のコマンドを入力します。

>ant deploy

5. アプリケーションの実行

次のコマンドを実行することにより、サンプルを実行します。名前をプログラム引数として含みます。

ant run -Dempno=<empNo> -Dname=<empName> -Dsal=<salary>

e.g. ant run -Dempno=359 -Dname=Debu -Dsal=5000

Javaクライアントにより生成された次の出力を確認できます。 レコードが作成されたかどうかは、データベース表で確認することもできます。

run:
[java] Employee with id:359 created

まとめ

このドキュメントで学習した内容は、次のとおりです。

  • EJB 3.0とEJBの以前のリリースとの相互運用性について
  • EJB 2.x Session BeanからのEntityManager APIの使用
  • シンプルなEJB 3.0 Entity BeanおよびEJB 2.x Session Beanを含むアプリケーションのOracle Application Server 10g 10.1.3 .1へのデプロイ