SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

EJB 2.1からEJB 3.0への移行

EJB 3.0における変更点と移行時のポイント

EJBエンティティBeanのクライアントを移行する

 EJB 2.1では、エンティティBeanのホームオブジェクトまたはローカルホームオブジェクトは、エンティティBeanのホームインターフェイスまたはローカルホームインターフェイスのcreate()メソッドを使って作成します。また、EJB 2.1では、エンティティBeanのクライアントは、JNDI検索を使ってエンティティBeanのローカルオブジェクトまたはリモートオブジェクトを取得します。次に、EJB 2.1でエンティティBeanのローカルホームオブジェクトを作成するサンプルコードを示します。

InitialContext ctx=new InitialContext();
Object objref=ctx.lookup("BookCatalogLocalHome");
BookCatalogLocalHome catalogLocalHome =
   (BookCatalogLocalHome)objref;

 このコードでは、BookCatalogLocalHomeBookCatalogBeanエンティティBeanのJNDI名です。

 EJB 2.1では、参照を取得した後、クライアントはcreate()メソッドを使ってローカルオブジェクトを作成します。

BookCatalogLocal catalogLocal = (BookCatalogLocal)
   catalogLocalHome.create(title);

 EJB 2.1では、finderメソッドを使ってローカルホームオブジェクトまたはホームオブジェクトからローカルオブジェクトまたはリモートオブジェクトを取得します。例えば、次のようにfindByPrimaryKeyメソッドを使ってローカルオブジェクトを取得することができます。

BookCatalogLocal catalogLocal = (BookCatalogLocal)
   catalogLocalHome.findByPrimaryKey(title);

 EJB 2.1では、remove()メソッドを使ってエンティティBeanのインスタンスを削除します。

catalogLocal.remove();

 EJB 3.0では、永続性の実装、検索、および削除にはjavax.persistence.EntityManagerクラスを使います。表2に、EJB 2.1のメソッドに対応する、EntityManagerクラスのよく使われるメソッドを示します。

表2 EntityManagerクラスのメソッド
EntityManagerのメソッド説明
persist(Object entity)エンティティBeanのインスタンスを永続化します。
createNamedQuery(String name)Queryオブジェクトのインスタンスを作成して名前付きクエリを実行します。
find(Class entityClass, Object primaryKey)エンティティBeanのインスタンスを検索します。
createQuery(String ejbQl)Queryオブジェクトを作成してEJBQLクエリを実行します。
remove(Object entity)エンティティBeanのインスタンスを削除します。

 EJB 3.0のエンティティBeanのクライアントクラスでは、@Resourceアノテーションを使ってEntityManagerオブジェクトを注入します。

@Resource
private EntityManager em;

 エンティティBeanのインスタンスを永続化する場合は、次のように、EntityManager.persist()メソッドを呼び出します。

BookCatalogBean catalogBean = new
   BookCatalogBean (title);
em.persist(catalogBean);

 同様に、エンティティBeanのインスタンスを取得する場合は、EntityManager.find()メソッドを呼び出します。

BookCatalogBean catalogBean = (BookCatalogBean)
   em.find("BookCatalogBean", title);

 EJB 3.0では、名前付きクエリfindByTitleに対応するクライアントクラスのfinderメソッドを定義することができます(EJB 2.1のfinderメソッドとは異なります)。このfinderメソッド内で、createNamedQuery(String)メソッドを使ってQueryオブジェクトを取得します。

Query query=em.createNamedQuery("findByTitle");

 Queryオブジェクトのパラメータは、setParameter(int paramPosition, String paramValue)メソッドまたはsetParameter(String parameterName, String value)メソッドを使って設定します。パラメータの位置はゼロベースです。

query.setParameter(0,  title);

 BookCatalogBeanオブジェクトのコレクションを取得するには、Query.getResultList()メソッドを使います。クエリの結果が1つだけの場合は、代わりにgetSingleResult()メソッドを使います。

java.util.Collection catalogBeanCollection =
   (BookCatalogBean)query.getResultList();

 最後に、EntityManager.remove(Object entity)メソッドを使ってエンティティBeanのインスタンスを削除します。

BookCatalogBean catalogBean;
em.remove(catalogBean);

 リスト4に、EJB 3.0のエンティティBeanに対する完全なステートレスセッションBeanのクライアントクラスを示します。

リスト4 BookCatalogClientクラス(完全なEJB 3.0クライアントクラス)
import javax.ejb.Stateless;
import javax.ejb.Resource;
import javax.persistence.EntityManager;
import javax.persistence.Query;

@Stateless
@Local
public class BookCatalogClient implements BookCatalogLocal
{


   @Resource
   private EntityManager em;

   public void create(String title)
   {
      BookCatalogBean catalogBean=new BookCatalogBean(title);
      em.persist(catalogBean);
   }
   public BookCatalogBean findByPrimaryKey(String title)
   {
      return (BookCatalogBean)em.find("BookCatalogBean", title);
   }

   public java.util.Collection findByTitle(String title)
   {
      Query query=em.createNamedQuery("findByTitle");
      query.setParameter(0, title);
      return (BookCatalogBean)query.getResultList();
   }

   public void remove(BookCatalogBean catalogBean)
   {
      em.remove(catalogBean);
   }
}

 本稿では、サンプルセッションBeanとサンプルエンティティBeanをEJB 2.1からEJB 3.0に移行する場合に必要なサンプルコードの変更について説明しました。EJB 2.0から移行する場合も同様です。

 本稿の執筆時では、JBoss Application ServerOracle Application ServerCaucho Application Serverなど、EJB 3.0仕様を既にサポートしているアプリケーションサーバーがいくつかありました。残念ながら、実装はアプリケーションサーバーによって異なっているようです。必ずしもEJB 3.0の機能がすべて実装されているわけではありません。詳しくは、アプリケーションサーバーの資料でご確認ください。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Deepak Vohra(Deepak Vohra)

O'Reillyの技術レビュー担当者として『WebLogic: The Definitive Guide』を担当。NuBeanコンサルタント、Web開発者でもある。Sun認定資格(Java 1.4プログラマおよびWebコンポーネントディベロッパJ2EEバージョン)を取得。メールの宛先はdvohra0...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/440 2006/08/22 15:50

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー