EJB 3.0を使用したEJB開発の簡素化Debu Panda著 Enterprise JavaBeans(EJB)は複雑なため、多くの開発者から批判が寄せられていました。 Java Community Processの JSR-220で機能するEJB 3.0は、アプリケーションの開発を簡素化し、Javaプラットフォーム用の永続化APIを標準化するよう設計されています。 この記事では、 Oracle Application Server EJB 3.0 Previewで入手できるEJB 3.0の完全実装により、EJBのプログラミング・モデルがいかに簡素化されるか、また、単純な永続化APIがいかに定義されるかを説明します。 EJB 2.xの複雑性現在のEJB 2.xモデルは、次のさまざまな理由により非常に複雑なものとなっています。
開発者のための簡素化現在の仕様でEJBを開発した経験があれば、HelloWorld EJBのような単純なEJBの開発でさえ難しいことはご存知でしょう。 このような単純なタスクでさえも、最低限 Beanクラスとデプロイメント・ディスクリプタの2つのインタフェースを必要とします。 Oracle JDeveloperなどのIDEや、 XDocletなどのユーティリティは、これら通常のタスクを簡素化しますが、それでも最適なコンテナにEJBをデプロイするには、開発者がこれらのクラスをコンパイルし、デプロイメント・ディスクリプタをパッケージ化する必要があります。 EJB 3.0は、次の方法で現在のEJBモデルの複雑性に対処するよう設計されています。
メタデータ・アノテーションEJB 3.0は、メタデータ・アノテーションに大いに依存しています。 メタデータ・アノテーションは、 JSR 175で標準化され、 J2SE 5.0の一部として提供されている機能です。 アノテーションは属性指向プログラミングの一種で、その機能はXdocletに類似していますが、XDocletとは異なり、コンパイル時にJavaコンパイラによりクラスに(@Retentionの設定に応じて)コンパイルされます。 EJB 3.0は、複数の成果物(インタフェースなど)を作成し、デプロイメント・ディスクリプタを置き換える際のメタデータ・アノテーションの使用をサポートすることにより、開発の簡素化を目指しています。 開発者から見ると、アノテーションはpublicと同じく修飾子であり、クラス、フィールド、メソッド、パラメータ、ローカル変数、コンストラクタ、列挙、パッケージで使用できます。 コードの生成やコードの文書化、またはビジネス・レベルのセキュリティや実行時の特殊ビジネス・ロジックの強化などの特別なサービスを提供するために使用できる属性を指定することにより、Javaコードでアノテーションを使用できます。 アノテーションの詳細は、Jason Hunterによる Making the Most of Java's Metadataを参照してください。 J2EE 5.0のおもな目標の1つは、アノテーションを使用した開発の簡素化であるため、独自のアノテーション一式が含まれています。 アノテーションには、次のように@マークが付きます。
POJOとPOJIの使用標準的には、JavaBeanとインタフェースは、Plain Old Java Object(POJO)とPlain Old Java Interface(POJI)と呼ばれる場合があります。 EJBクラスとインタフェースは、それぞれPOJOとPOJIに類似しています。 ホーム・インタフェースなどの青果物の不要な要件は削除されています。 javax.ejb packageで、EJBインタフェース( SessionBean、EntityBeanまたは MessageDrivenBean)のいずれかを実装する必要はありません。 かわりに、 Stateless、Stateful、MessageDrivenまたは Entityのいずれかを使用して、Beanクラスに注釈を付けることができます。 たとえば、HelloWorldなどのステートレスEJBを定義する場合、次のようにEJBを定義できます。
EJBのインタフェースは、リモートの場合もローカルの場合も、 EJBObjectまたは EJBLocalObjectを実装する必要はありません。 BeanクラスはEJBのビジネス・インタフェースを実装するようになりました。この例では、 HelloWorldBeanは HelloWorldインタフェースを実装しています。
前述のコード例を見ると、このインタフェースがリモート・インタフェースであることを示す @Remoteが使用されていることが明らかに分かります。 必要に応じて、EJBにリモート・インタフェースとローカル・インタフェースを持たせることができます。 ホーム・インタフェースは、Session Beanについてもオプションとなっています。 前述の例を見ると、EJB 3.0では、デプロイメント・ディスクリプタの作成や不必要なコールバック・メソッドの実装など、通常のタスクの多くが廃止されていることが分かります。 コールバック・メソッドの必要性の排除EJB 2.1以前のリリースでは、機能面では不要であるにもかかわらず、各EJBに対し ejbPassivate、ejbActivate、ejbLoad、ejbStoreなどの複数のライフ・サイクル・メソッドの実装が必要でした。 たとえば、 ejbPassivateはステートレスSession Beanには不要ですが、Beanクラスには実装する必要があります。 EJB 3.0は通常のJavaクラスと同様になったため、これらのライフ・サイクル・メソッドの実装はオプションとなっています。 EJB 3.0では、ライフ・サイクル・コールバック・メソッドを、Beanクラスで、または外部クラスとして定義できます。 任意メソッドはすべて、次の例に示すように、アノテーションを使用してコールバック・メソッドとしてマークできます。
インターセプタインターセプタは、メソッド呼び出しフローに対するきめ細かな制御を提供します。 インターセプタは、ステートレスSession Bean、ステートフルSession Bean、Message-Driven Beanで使用できます。 インターセプタは、同じBeanクラスまたは外部クラスにあるメソッドです。 アノテーションとデプロイメント・ディスクリプタの比較前述のとおり、EJB 3.0では、デプロイメント・ディスクリプタにかわってアノテーションを使用します。 デプロイメント・ディスクリプタの各属性にはデフォルト値があるため、デフォルト値以外の値を必要とする場合を除き、これらの属性を指定する必要はありません。 これらの値は、Beanクラス自体でアノテーションを使用して指定できます。 また、EJB 3.0仕様は、Beanタイプ、インタフェースのタイプ、リソース参照、トランザクション属性、セキュリティなどのメタデータ・アノテーションのセットも定義します。 たとえば、特定のEJBメソッドに対してセキュリティ設定を定義する場合、Beanクラスで次のように定義できます。
これからは、このような扱いづらいXMLディスクリプタを記述する必要はありません。 Container Managed Persistence(CMP)の簡素化EJB 3.0では、Container Managed Persistence(CMP)Entity Beanが大幅に改良され、開発者にとって不可欠なものとなりました。 EJB 3.0では、 Oracle TopLinkやHibernateなどの軽量な永続化モデルを採用しています。 Entity BeanはPOJOとなったため、コンポーネント・インタフェースは不要になりました。 Entity Beanは現在、継承とポリモフィズムをサポートしています。 次に、非常に簡単なEntity Beanのソース・コードを示します。
このコードを見ると、Beanクラスが具象クラスであり、CMP 2.x Entity Beanのような抽象クラスではないことが分かります。 Entity Beanで行われている主要な機能拡張の一部を次に示します。
O-RマッピングのためのメタデータO/Rマッピング・アノテーションのためのメタデータにより、O/Rマッピング・メタデータを使用してEJB 3.0 Entity Beanクラスを修飾できます。 このメタデータは、Entity Beanの永続性と取得の定義に使用されます。 つまり、ベンダー固有のディスクリプタでO-Rマッピングを定義する必要がなくなりました。 前述の例では、 @Tableアノテーションと @Columnアノテーションを使用して、Entity Beanの基盤となるデータベースの表名と列名を指定しています。 マッピング・アノテーションを使用して、エンティティ間の関係を定義することもできます。 以下に例をあげます。
使用可能なマッピング・アノテーションのリストは、 How To Mapping Annotationsを参照してください。 継承継承は、さまざまな状況で非常に便利です。 Oracle Application Server EJB 3.0 Previewで一般的に使用され、サポートされている継承には、次の2つのタイプがあります。
継承は、アノテーションを使用して表します。 結合サブクラス戦略を使用するコード例を次に示します。
Entity Beanに対するCRUD操作のためのAPIの簡素化 Entity Beanインスタンスの作成、検索、更新、削除には、 javax.persistence.EntityManager APIを使用します。 Entity Beanインスタンスを検索し、それを操作する複雑なコードを記述する必要はありません。 Session BeanにEntityManagerのインスタンスを注入し、EntityManagerインスタンスでpersistメソッドまたはfindメソッドを使用して、Entity Beanオブジェクトの作成や問合せが行えます。次にコード例を示します。
問合せの拡張問合せは、現在はデプロイメント・ディスクリプタで定義するかわりに、メタデータを使用してEntity Bean自体に定義します。 EJB 3.0は、バルク更新や削除のサポートなど、EJBQLのさまざまな制限に対処しています。 さらに、ネイティブSQL問合せのサポートも追加されました。クライアントのためのEJBの簡素化EJBの使用は、EJBが同じアプリケーションに配置されている場合でも非常に複雑です。 たとえば、他のEJBからEJB 2.xを使用する場合、デプロイメント・ディスクリプタで ejb-refまたは ejb-local-refを定義し、EJBを検索し、インスタンスを作成してから、メソッドを呼び出す必要があります。 それに対し、EJB 3.0では、次のようにアノテーションを使用して、Beanで簡単に依存性を定義し、メソッドを呼び出すことができます。
依存性の注入を使用して、DataSource、JMS、Webサービスなど、あらゆるタイプの環境参照およびリソース参照を検索できます。 コンテナ外部でのテスト容易性の有用性EJB 2.1仕様に依存する開発者には、テストも困難な作業です。 EJBの開発とテストにはEJBコンテナが必要であり、テストを実行する最終配置プラットフォームに精通している必要があります。 EJB 3.0では、コンテナの外部でEJBをテストできます。 Oracle Application Server EJB 3.0 Previewに付属する Entity Test Harnessを使用すれば、EJB 3.0のテストが行えます。 結論企業のJava開発者は、EJB 3.0に大いに期待しています。 EJB 3.0仕様で説明されている提案は、すべての開発者にとって複雑性の解消に役立ちます。 Oracle Application Server EJB 3.0 PreviewにはEJB 3.0 Early Release Draft2仕様の完全実装が提供されているため、EJB 3.0アプリケーションの構築をすぐに開始できます。 参考資料
著者プロフィールDebu Pandaは、Oracle Application Server開発チームの製品部長で、EJBコンテナとTransaction Managerを担当しています。 IT業界で13年を超える経験があり、複数の雑誌で記事を執筆し、技術会議にも数多く出席しています。 著者のJ2EE関連のブログは、
こちらからアクセスできます。
|