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;
このコードでは、BookCatalogLocalHomeがBookCatalogBeanエンティティ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クラスのよく使われるメソッドを示します。
| 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のクライアントクラスを示します。
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 Server、Oracle Application Server、Caucho Application Serverなど、EJB 3.0仕様を既にサポートしているアプリケーションサーバーがいくつかありました。残念ながら、実装はアプリケーションサーバーによって異なっているようです。必ずしもEJB 3.0の機能がすべて実装されているわけではありません。詳しくは、アプリケーションサーバーの資料でご確認ください。
