第3回 CMP Entity Beanのメリット

EJBコンソーシアム
2004/12/18



主な内容
Entity Beanとは
JBossIDEを使ってCMP Entity Beanを作る
データソースの接続

  この連載の第1回では、EJBが難しいと思われる理由として以下のものを挙げました。

  • EJBを開発する環境や実行する環境を作るのは難しいのでは?
  • デプロイメントディスクリプタや各種インターフェイスなど付加的なものがあって難しそう
  • EJBを使うメリットが分かりづらい

 第1回「EJBの学習の準備」でJBoss、Eclipse、JBossIDEを用いて開発環境を整えることにより、1つ目の問題点に答え、第2回「XDocletでEJB作成を簡単にする」で、XDocletを用いてSession Beanを作ることにより、付加的なファイルを自動生成できることを示し、2つ目の問題に答えました。

 今回は、データベースにアクセスするEntity Beanを作成する過程を説明することによってEJBを使うメリットを説明したいと思います。

Entity Beanとは

 前回は、3種類のEJBの中でも主にビジネスロジックを扱うSession Beanについて説明しました。今回は、主にデータベースなどのデータソースのデータを扱うEntity Beanについて説明したいと思います。

 Entity Beanには、データソースとのやり取りをBean開発者が行う(すなわちデータアクセス処理をプログラマが記述する)BMP(Bean-managed Persistence)Entity Beanとデータソースとのやり取りをコンテナが行うCMP(Container-managed Persistence)Entity Beanがあります。BMP Entity Beanでは、Bean開発者がデータソースにアクセスするコードを書く必要があります。そのため、EJBの実装ファイルの中にSQL文が書かれます。

 BMP Entity Beanでは、データソースにアクセスする処理を全部書かなければいけないためコード量が多くなりますが、コンテナがサポートしないRDBにアクセスする場合やRDB以外のデータソースにアクセスする場合にも対応できます。一方、CMP Entity Beanでは、データソースへのアクセスをコンテナが受け持つため、データソースにアクセスするコードを開発者が記述する必要はありません。しかし、どのようにデータソースにアクセスするかをコンテナに指示しなければいけません。この情報は、デプロイメントディスクリプタに書かれますので、CMP Entity Beanでは、デプロイメントディスクリプタに記述する情報も複雑になります。

 CMP Entity Beanは、データソースにアクセスするコードを記述する必要がないため、EJBの実装は単純になりますが、デプロイメントディスクリプタを書くことは簡単ではありません。しかし、XDocletを使うことによってデプロイメントディスクリプタを自動生成することができ、これによって簡単にCMP Entity Beanを作成することができます。

JBossIDEを使ってCMP Entity Beanを作る

 ここでは、銀行口座テーブルにアクセスするCMP Entity Beanを作成してみます。前回のSession Beanを作成したときと同様に、JBossIDE上でXDocletを用いて開発を進めていきます。まず、Eclipseを立ち上げます。今回は前回作成したJavaプロジェクトをそのまま使います。そのプロジェクトに新たにEntity Beanを追加します。

Bean実装ファイルの作成

 EJBのBean実装ファイルを作成します。このクラスは、javax.ejb.EntityBeanインターフェイスを実装している必要があります。ここでは、このクラスのパッケージをsample、クラス名をBankBeanとします。このクラスを作成するには、以下の手順になります。

1.作成したプロジェクトの「src」フォルダ上で、マウスの右ボタンをクリックし、[新規]→[クラス]を選択する

2.[パッケージ]フィールドに「sample」、[名前]フィールドに「AccountBean」と入力する

3.
修飾子フィールドのabstract項目のチェックボックスにチェックを入れる

4.[インターフェイス]フィールドの[追加]ボタンをクリックし、表示されたダイアログ上で「インターフェイスを選択してください」と書いてあるフィールドに「EntityBean」と入力し、マッチした「javax.ejb.EntityBean」を選択し、[OK]ボタンをクリックする

5. [終了]ボタンをクリックする

 エディタ上にいま作成されたクラスが表示されていると思います。ここでは、EntityBeanインターフェイスで定義されていたメソッドが自動的に追加されています。今回はここで特別な処理をしませんので、これらのメソッドはこのままにしておきます。

 ここでCMP Entity Beanが永続化するフィールドを定義します。ここでは口座番号を表すString型のnumberフィールド、口座の残高を表すint型のamountフィールドを作成します。CMP Entity Beanでは永続化するフィールドは、そのフィールド名に対応した抽象メソッドのgetter/setterメソッドとして定義されます。このため、CMP Entity BeanのBean実装ファイルはabstractクラスである必要があります。ここでは上記の2つのフィールドを使用するため、以下のメソッドを作成しました。

public abstract long getNumber();
public abstract void setNumber(long number);

public abstract int getAmount();

public abstract void setAmount(int amount);

 また、Entity BeanではEJBを生成する際に呼び出されるejbCreateメソッドとその後に呼び出されるejbPostCreateメソッドを作成する必要があります。この引数として、ここではnumberとamountを指定しています。ejbPostCreateでは通常EJBを生成した後に行う処理を記述しますが、今回は特に何もしませんので空のメソッドにしました。

public String ejbCreate(String number, int amount) throws CreateException {
    setNumber(number);
    setAmount(amount);
    return null;
}

public void ejbPostCreate(String number, int amount) {
}

 次に、このクラスからXDocletがEJBに関連するファイルを自動生成できるように、このクラスに付加情報を付けていきます。まず、クラスレベルのXDocletコメントを作成します。クラス作成時に作成されたクラスレベルのJavaDocコメント(/**で始まるブロックコメント)の中で、@を入力し、その後ろでCtrl+Spaceキーを押します。すると、補完の候補が表示されます。

 ここでは、このテンプレートの中から「Entity CMP EJB」を選択します。すると、@ejb.beanで始まるコメントが生成されます。ここで生成されたコメントを自分の環境に合わせて変更します。ここでは、view-type属性がlocalに設定されているため、このEJBはローカル参照のみで使用されます。local-jndi-name属性を用いて、このEJBのローカルインターフェイスにアクセスするためのJNDI名を設定します。description属性、display属性を好みに合わせて変更します。また、このEJBはCMP Entity Beanであるため、type属性にCMPが指定されています。今回はEJBの仕様として2.0を使用するため、cmp-versionには2.xを指定しました。このEJBの主キーになるのはnumber属性であるため、primary-field属性をnumberに変更しています。また、schema属性は今回必要ないため削除しました。コメントに@ejb.persistence要素を追加し、table-name属性を用いてデータを格納するテーブルを指定します。

 また、@jboss.persistence属性を用いてJBossサーバに特化した項目について設定します。ここではdatasource属性でデータを格納するデータソース、datasource-mapping属性でそのデータソースのタイプ、create-table属性でEJBをデプロイしたときにテーブルを作成するかを指定します。今回は自動にテーブルを作成したいのでtrueにしました。データソースについてはこのドキュメントの最後に記述します。

/**
  * @ejb.bean description="Sample Account EJB"
  * display-name="Account"
  * local-jndi-name="ejb/sample/Account"
  * name="Account"
  * primkey-field="number"
  * type="CMP"
  * view-type="local"
  * cmp-version = "2.x"
  * @ejb.persistence table-name = "account"
  * @jboss.persistence datasource = "java:DefaultDS"
  * datasource-mapping = "Hypersonic SQL"
  * create-table = "true"
*/
public abstract class AccountBean implements EntityBean {
……

 次にメソッドレベルのXDocletコメントを記述します。先ほど作成したアクセスメソッドに以下のような要素を追加します。それぞれのgetメソッドに@ejb.persistent-field要素を追加することによって、この属性がデータベースに格納される属性であることを指定します。また、それぞれのメソッドに@ejb.interface-method要素を加えることによって、このメソッドがビジネスインターフェイスに追加されます。今回はローカルインターフェイスのみ作成しているため、これらのメソッドはローカルインターフェイスに追加されます。

/**
  * @ejb.persistent-field
  * @ejb.interface-method
*/
public abstract String getNumber();
/**
  * @ejb.interface-method
*/
public abstract void setNumber(String number);

/**
  * @ejb.persistent-field
  * @ejb.interface-method
*/
public abstract int getAmount();
/**
  * @ejb.interface-method
*/
public abstract void setAmount(int amount);

 また、createメソッドに以下のような要素を加えます。

/**
  * @ejb.create-method
*/
public String ejbCreate(String number, int amount) throws CreateException {

 これで、Bean実装ファイルの実装が完了しました。これ以外にも例えばEJB検索メソッドなどさまざまな要素が指定できますので、詳しくはXDocletのサイトを参照してください。

EJB関連ファイルの生成およびデプロイ

 ここでは、いま作成したBean実装ファイルからXDocletを用いてインターフェイスやデプロイメントディスクリプタを生成します。XDocletの設定はすでに前回完了していますので、今回は設定をスキップし、XDocletを呼び出します。これは、プロジェクトを選択し、右ボタンをクリックし、「Run XDoclet」を選択することによって呼び出されます。これで、インターフェイスやユーティリティクラス、デプロイメントディスクリプタが生成されました。次にEJB-jarを生成します。この設定も前回すでに完了していますので、今回は設定をスキップし、EJB-jarを生成する処理を呼び出します。これは、プロジェクトを選択し、右ボタンをクリックし、「Run Packaging」を選択することによって呼び出されます。これで、プロジェクトの直下にStandard-EJBというファイルが生成されました。これを再びサーバ上にデプロイし、JBossサーバを起動することによりこのEJBが利用可能になります。この手順は前回の内容を参照してください。

データソースの接続

 J2EEアプリケーションでは、データベースとはデータソースを用いて接続することが一般的です。このデータソースは通常コンテナの設定として定義します。JBossでは、これは$JBOSS_HOME/server/<設定名:例default>/deployの下にxmlファイルを置くことにより定義します。今回は、デフォルトで作られているデータソースを使用します。この定義はhsqldb-ds.xmlに書かれています。ここで使用されるデータベースは、HSQLDBというJavaで書かれたデータベースで、JBossを起動すると使用できますので、テストや評価などの目的には簡単に使えてよいでしょう。このデータソースのJNDI名はDefaultDSで、コンテナ上で動作するプログラム中からはjava:DefaultDSでアクセスすることができます。

 次回は、この連載で作成したEJBを利用するクライアントを作成してみたいと思います。また、EJB 3.0も見えてきましたので、今後の方向性について考えてみたいと思います。

筆者プロフィール

鷲尾典俊
EJBコンソーシアム オープンソース研究会 JBossチーム リーダー(日立ソフトウェアエンジニアリング株式会社 インターネットビジネス部)

河村嘉之
EJBコンソーシアム オープンソース研究会 副主査(日立ソフトウェアエンジニアリング株式会社 研究部)


【筆者あとがき 】
EJBコンソーシアムでは、オープンソースプロダクトを題材にJ2EE技術者のすそ野を広げる目的で、J2EEオープンソース研究会を立ち上げ、第1期としてJBossとJUnitに関する教材を作成いたしました。なお、この原稿はEJBコンソーシアムJ2EEオープンソース研究会JBossチームの成果を基に書かれています。このチームの成果は、以下の各社の皆さまの努力によるものです。

 川鉄情報システム株式会社
 株式会社電通国際情報サービス
 株式会社トスコ
 日立ソフトウェアエンジニアリング株式会社
 富士通株式会社
 株式会社豆蔵




Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間