Java2 Enterprise Editionの基礎知識

EJBの種類を教えてください

テンアートニ 中越智哉
2001/2/27

 EJBには、大きく分けるとEntity BeanとSession Bean があります。さらに、Entity Beanは、CMP Entity Bean と、BMP Entity Beanに、Session Beanは、Stateless Session Beanと、Stateful Session Beanに分けられます。

■Entity Bean
 Entity Beanは、「永続化されたデータそのもの」を表すBeanです。「データ」の実体となりうるものは、幾つか考えられますが、分かりやすい例を挙げると、データベースを対象にした場合、テーブルの1レコードが、Entity Beanの1インスタンスに対応していると考えることができます。ですから、各インスタンスを識別するために、Entity Beanにはプライマリ・キーを持たせることができ、さらに、Entity Beanの内容が変更されると、対象となるデータベースのレコードも内部で自動的に更新(永続化)されるため、EJBサーバを終了させても、データが消滅することはありません。

 Entity Beanは、さらにその内容から、CMP Entity Beanと、BMP Entity Beanに分類されます。

■CMP Entity Bean
 CMP Entity BeanのCMPとは、Container Managed Persistence の略で、永続化に関する処理を、EJBコンテナが行うという意味になります。ですから、CMPの場合、開発者はリソース(データベースなど)へのアクセスのためのコードを書く必要がなく、あたかも一般的なプロパティを持ったBeanであるかのように記述するだけで、リソースとのやりとりはすべてEJBコンテナが行ってくれます。

■BMP Entity Bean
 BMP Entity BeanのBMPとは、Bean Managed Persistenceの略で、永続化に関する処理を、Bean自身が行うという意味になります。ですから、リソースへのアクセスコードは、すべて開発者が記述する必要があります。当然、実装はCMPよりも面倒になりますが、その代わり適用範囲が広く自由度も高くなります。

■CMPとBMPの使い分け
 EJBのスタンスを考えたとき、上の記述だけを見れば、CMPを使用すべきなのは明らかです。CMPであれば、リソースの種類の違いはすべてEJBコンテナの側で吸収してくれますし、いちいちアクセスコードを書かずに済みますので、コーディング量も削減できます。では、BMPが必要な場面は実際にあるのでしょうか? 実は、現在のEJBの仕様では、CMPの適用範囲には制限が多く、CMPだけでは扱えないリソースが多いのです。そのため、CMPでは扱えないリソースには、BMPを使ってアクセスするしかない、ということになります。具体的には、CMPは単一のテーブルしか扱えず、キーの扱いにも制限があります。マスタ保守などの用途ならばともかく、業務系のデータベースの場合、複数のテーブルを組み合わせて使用することが非常に多いことを考えても、とてもCMPだけでは対応できません(注:EJB2.0(次期バージョン)では、CMPの機能に拡張が加えられる予定です)。

■Session Bean
 Session Beanは、主にビジネスロジックを実行するためのBeanです。Entity Beanとは異なり、Bean自身の情報が、永続化されることはなく、「セッション」単位での処理を記述することから、こういう名称になったと思われます。ですから、EJBサーバが終了すると、Beanの状態も破棄されてしまいます。

 Session Beanは、さらにその内容から、Stateless Session Beanと、Stateful Session Beanに分類されます。

■Stateless Session Bean
 Stateless Session Beanは、その名のとおり、状態を保持しないBeanで、Beanのインスタンスの生成・消滅は、すべてEJBコンテナが独自に管理しています。ですから、同じBeanのメソッドを続けて呼び出した場合にも、それらが同じインスタンスである保証はありません。そのため、Stateless Session Beanでは、内部状態を保持して、複数メソッドで連続した処理を行うことはできず、1メソッドで完結するような処理を記述するのに向いています。

■Stateful Session Bean
 Stateful Session Beanは、内部的な状態の保持を行うことのできるBeanで、一般的なクラスのインスタンスとほぼ同じ感覚で使用することができます。Stateless Session Beanとは異なり、BeanはHome Interfaceからの生成によってインスタンス化された後は、メソッドの呼び出しごとに生成、消滅することはありませんので、セッション単位で連続した処理を行うのに向いています。

 

「Java Solution FAQ」




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

注目のテーマ

Java Agile 記事ランキング

本日 月間