How-To: WebモジュールからのEJB 3.0 EntityManager APIの使用
日付:2006年5月16日
著者:Debu Panda
はじめに
このサンプル・アプリケーションでは、エンティティを使用したEJB 3.0 JPA仕様に対するオラクルのサポートと、Webコンテナからコンテナ管理のEntityManager APIを使用する方法について説明します。 サンプルでは、Webアプリケーションから新しいEJB 3.0エンティティの使用例を提供します。 サンプルでは、Webモジュールのエンティティを、WEB-INF/libディレクトリのjarファイルにパッケージ化します。
EJB 3.0では、次の仕様により、開発が大幅に簡素化されています。
- 簡単なJavaクラス(POJO)をBeanクラスに使用可能であること
- Entity Beanへのインタフェースが不要であること
- O-Rマッピングにアノテーションを使用していること
このデモンストレーションでは、
Employeeエンティティを例に、EJB 3.0によるEntity Beanについて説明します。
EJB 3.0によるエンティティの例
Beanクラスは、エンティティであることを示す@Entityで注釈される簡単なJavaクラスです。
@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;
}
..
}
@Table注釈は、このEntity Beanで使用する表の名前を特定する場合に使用します。
@Id注釈は、empNoフィールドをEntity Beanの主キーとして示す場合に使用します。
@Column注釈は、empNoフィールドが表内のEMPNO列にマッピングされたことを指定する場合に使用します。
WebモジュールからのEntityManager APIの使用
javax.persistence.EntityManager API は、Entity Beanインスタンスの作成、検索、および更新で使用します。 Oracle Application Server 10g 10.1.3.1では、次の3つの方法でWebモジュールからEntityManagerのインスタンスを取得できます。
- コンテナ管理の
PersistenceContextを使用した依存性の注入。
EntityManagerは事実上スレッドセーフが保証されていないため、これは推奨されません。 ただし、オラクルの
EntityManagerの実装は、事実上スレッドセーフです。
- JNDIルックアップを使用したコンテナ管理の
EntityManager 。
PersistenceContextアノテーションまたはweb.xmlのpersistence-context-refのいずれかを使用して、永続性コンテキストに参照を定義します。
-
PersistenceUnitのインスタンスを注入し、
createEntityManager()メソッドを使用して
EntityManagerを作成する、アプリケーション管理のエンティティ・マネージャ。
EntityManager APIはトランザクション内での使用が必要なため、WebモジュールではUserTransaction APIを使用して、手動でトランザクションの境界を設定する必要があります。
ここでは、
InsertServletがEntityManagerインスタンスを検索してから、次のようにエンティティ・インスタンスを維持する例を示します。
@PersistenceContext(name="howto/EntityManager",unitName="howto")
public class InsertServlet extends HttpServlet {
..
ut = (UserTransaction)initCtx.lookup("java:comp/UserTransaction");
ut.begin();
Context context = new InitialContext();
Employee employee = new Employee();
employee.setEmpNo(empId);
employee.setEname(name);
employee.setSal(sal);
EntityManager em = (EntityManager)context.lookup("java:comp/howto/EntityManager");
em.persist(employee);
ut.commit();
..}
Webモジュールは、
java:comp/ejb/<persistence-context-ref-name>のJNDIバインドを使用して、EntityManagerを検索可能です。
前提条件
必須知識
アプリケーションのサンプルを完了させるには、以下を熟知している必要があります。
EJB 3.0の詳細は、OTNの次のドキュメントを参照してください。
ソフトウェア要件
このデモンストレーションでは、次のソフトウェア・コンポーネントがインストールされ、正しく構成されている必要があります。
表記法
- %ORACLE_HOME% - Oracle Application Server 10g 10.1.3.1をインストールしたディレクトリ
- %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-emAPIfromweb.html - このWebサイト
- src - デモンストレーションのソース
- ejb - Entity Beanのサンプル・コードの格納先
- web - アプリケーションの格納先
2. 環境の設定
次の環境変数が定義されていることを確認してください。
- %ORACLE_HOME% - Oracle Containers for J2EE(OC4J)がインストールされているディレクトリ
- %JAVA_HOME% - J2SE 5.0がインストールされているディレクトリ
- %PATH% -
%ORACLE_HOME% /ant/binを含む
データベースの構成
このサンプルは、OracleデータベースのSCOTTスキーマにある
EMP表を基にしています。 OracleデータベースにSCOTTスキーマがインストールされていない場合、またはOracle以外のデータベースを使用している場合、自動的な表の作成が変更されているため、表はアプリケーションをデプロイしている最中に自動作成されます。 このほか、
the %HOWTO_HOME%/scriptsディレクトリの
table.sqlスクリプトを使用して、手動で表を作成することもできます。
データソースの設定
このサンプルでは、EMP表を含むデータベースに接続するため、DataSourceを設定する必要があります。
Oracle Containers for J2EEの場合、
%ORACLE_HOME%/j2ee/home/config/data-sources.xmlファイルのDataSourceを設定して、EMP表を保持するスキーマを指すように指定します。
設定例は、以下のとおりです。
<connection-pool name="ScottConnectionPool">
<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="ScottConnectionPool"
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インスタンス/グループなどです。
アプリケーションを構築するには、
%HOWTO_HOME%ディレクトリで次のコマンドを入力します。
>ant
これで、
%HOWTO_HOME%/libディレクトリ内に
ejb30entity.earが新しく作成されます。
構築が成功すると、このコマンドはアプリケーション・アーカイブのデプロイを試みます。 このコマンドはデプロイを実行する前に、Oracle Containers for J2EEが稼働しているかをテストします。
アプリケーションは、別々にデプロイすることもできます。
%ORACLE_HOME%の環境変数が定義されていることを確認したら、
%HOWTO_HOME%ディレクトリから次のコマンドを入力します。
>ant deploy
5. アプリケーションの実行
任意のWebブラウザから次のURLを起動して、サンプルを実行します。
http://localhost:8888/ejb30EMfromweb
このページで、Employee No、Name、およびSalaryを入力したら、「
Add Employee」ボタンをクリックします。
InsertServletが、
EntityManager APIを使用してBeanインスタンスを作成するために呼び出されます。
レコードの挿入が成功した場合、成功したページへリダイレクトされます。 レコードが作成されたかどうかは、データベース表で確認することもできます。
まとめ
このドキュメントで学習した内容は、次のとおりです。
- EJB 3.0による簡単なEntity Beanの開発
- WebモジュールからのEntityManager APIの使用
- Oracle Application Server 10g 10.1.3.1を使用した簡単なエンティティのデプロイおよび実行
|