Java EE 6ではEJBの定義とパッケージングが簡素化されています。一つのアノテーション( @Stateless 、 @Stateful 、または @Singleton )を付与するだけでPOJOがEJBに変換されます。EJBはWARファイル内の WEB-INF/classes ディレクトリにパッケージングされ、特殊なパッケージングは必要ありません。
このセクションではデータベースに問い合わせるEJBを作成します。
1ステートレスEJBを新規作成します。”org.glassfish.sample”パッケージで右クリックして、”New”、”Session Bean…”を選択し、EJB名に”CustomerSessionBean”を入力してください。以下のように、全てデフォルトのまま”完了”をクリックしてください。
これでステートレスEJB が作成されます。生成されたEJBがインタフェースを実装しておらず、単一のクラスがEJBを表現していることに着目してください。これはEJB 3.1の新機能です。
2EJBは再入可能ではないので、Servletで EntityManagerFactory をインジェクションしていたのに対し、以下のように EntityManager のインスタンスをインジェクションできます。
@PersistenceContext
EntityManager em;
エディタパネルを右クリックし、“Fix Imports”を選択し、インポートを解決してください。
public List<Customer> getCustomers() {
return (List<Customer>)em.createNamedQuery("Customer.findAll").getResultList();
}
ここでの実装は、先ほどServletで使用したものと似ています。
たったこれだけでEJBを作成できます。デプロイメント記述子や特別なパッケージングは必要ありません。この場合はEJBはWARファイルにパッケージングされます。
サーブレット中のデータベースアクセスコードをなくせます。そして、すべての機能がEJBに委譲させることができます。サーブレット中のコードを次のように置換してください。
@PersistenceUnit EntityManagerFactory emf;
を
@EJB CustomerSessionBean bean;
に。そして次のコードを
List<Customer> result = (List<Customer>)emf.
createEntityManager().
createNamedQuery("Customer.findAll").
getResultList();
を
List<Customer> result = bean.getCustomers();
に置換してください。 @EJB アノテーションを使用することでこんなに簡単にEJBをインジェクションでき、ビジネスメソッドを呼び出すことができることに着目してください。
“http://localhost:8080/JavaEE6SampleApp/TestServlet” を再読み込みすれば以下のように表示されます
これは先ほどの出力結果とほとんど同じであり、そこがポイントです。EJBでは全てのメソッドでトランザクション管理が自動的に行われるため、データベースアクセスにより向いています。データベースに値を登録するコードを追加すればこの利点はより明白になるでしょう。サーブレットの代わりにEJBを使用することでトランザクションの明示的な開始、コミットを行う必要がなくなるでしょう。
先ほどの出力結果との違いはタイムスタンプが更新されていることと、アクセス回数が1増えていることだけです。