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 3.0の詳細は、OTNの次のドキュメントを参照してください。
ソフトウェア要件
このデモンストレーションでは、次のソフトウェア・コンポーネントがインストールされ、正しく構成されている必要があります。
- Sun JDKバージョン1.5またはそれ以上(
ダウンロードはこちら)
- Apache Antバージョン1.6.2またはそれ以上(
ダウンロードはこちら)
- Mozilla、Microsoft Internet Explorer、NetscapeなどのHTMLブラウザ
- Oracleなどのリレーショナル・データベース
表記法
- %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へのデプロイ
|