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 2.1
  • EJB 3.0

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を使用した簡単なエンティティのデプロイおよび実行