Enterprise JavaBeansには、エンティティBean、セッションBeanまたはMessage-Driven Beanがあります。
エンティティBeanは、データベース内の永続データと、そのデータに働きかけるメソッドを表します。リレーショナル・データベースの場合には、表の各行に対して1つのBeanが存在します(ただし、エンティティは、ビューまたはその他の複雑な問合せに基づく場合もあります)。レコードに対する各エンティティBeanは、一意の主キーにより識別されます。エンティティBeanを作成する場合、Enterprise JavaBeanウィザードではcreate()メソッドおよびその主キーを使用してエンティティBeanを作成します。
エンティティBeanのライフ・サイクルは、それが実行される仮想マシンのライフ・サイクルによる制限を受けないのが普通です。仮想マシンがクラッシュした、またはデータベースで現在のトランザクションがロールバックされた場合でも、エンティティBeanと、他のクライアントからの参照は破棄されません。その後クライアントは、オブジェクト参照および主キーを使用して、あるいはそのコンテナが状態を再ロードする際に、同じエンティティBeanに再接続できます。
エンティティBeanでは、独自に永続性を管理する(Bean管理の永続性、BMP)か、コンテナに永続性を管理させます(コンテナ管理の永続性、CMP)。
コンテナ管理の永続性(CMP)エンティティBeanでは、永続性に関するタスクがそのコンテナに委譲されるため、EJBのビジネス・ロジックの開発に専念できます。JDeveloperを使用してエンティティBeanをデプロイする場合、デプロイメント・ディスクリプタにおけるCMPフィールドと、そのデータベースへのマップ方法がJDeveloperにより識別されます。エンティティBeanを永続させるために必要なロジックは、コンテナにより生成されます。
データベースにマップされるフィールドは、コンテナ管理のフィールドと呼ばれます。これらのフィールドは、任意のJavaプリミティブ型にすることも、EJBモジュール・エディタで作成および管理が可能なシリアライズ可能オブジェクトにすることもできます。
また、データベース表からCMP Beanをリバース・エンジニアリングできます。これには、CMPエンティティBean作成(表ベース)ウィザードを実行します。このウィザードにより、データベース内の指定した各表に対してCMP EJBが作成されます。JDeveloperでEJBを作成し、データベース表として生成する場合は、Enterprise JavaBeanウィザードを使用してエンティティBeanを作成します。
Bean管理の永続性(BMP)エンティティBeanでは、永続性のロジックを明示的に記述する必要があります。データベース・テクノロジについての知識に加えて、Beanのフィールドを明示的にデータソースへマップすることが必要になります。BMP Beanは、データベースまたはフラット・ファイルなどのレガシー・システムにマップできます。
セッションBeanはクライアントにより作成され、1セッションの間のみ存続します。セッションBeanは、データベースの読取り、書込みまたは更新などの操作をクライアントにかわって実行しますが、データベースに格納されるデータを表すわけではありません。セッションBeanはトランザクション対応にできます。ただし、永続的ではないため、システム・クラッシュ後のリカバリは不可能です。
セッションBeanをステートフルにした場合、カンバセーショナル・ステートをメソッド間およびトランザクション間で維持できます。ステート(状態)とは、セッションBeanとそのクライアントとの間におけるカンバセーション(対話)を説明する用語です。EJBコンテナが、セッションBeanのカンバセーショナル・ステートを管理し、不要になった時点でセッションBeanを破棄します。
ステートフル・セッションBeanは、クライアント・アプリケーションを拡張してそのタスクを代行し、クライアントに関するステートを維持します。このステートにより、クライアントとステートフル・セッションBeanとの間のカンバセーションが維持されます。ステートフル・セッションBean内のメソッドが、このカンバセーショナル・ステートとの間でデータの読取り/書込みを行い、それがBean内の他のメソッド間でも共有されます。ステートフル・セッションBeanのサービス対象は、一度に1クライアントのみです。
エンティティBeanとは異なり、ステートフル・セッションBeanはデータベースに格納されるデータを表すものではなく、データベースまたはシステムのクラッシュ時には消失します。
ステートレス・セッションBeanは内部ステートを持たないため、受動化する必要がなく、複数のクライアントに効率的にサービスを提供できます。ステートフル・セッションBeanとは異なり、ステートレス・セッションBeanは1クライアント専用ではありません。
Message-Driven Beanは、カンバセーショナル・ステートがなく、複数のクライアントからのメッセージを同時に処理できるという点でステートレス・セッションBeanと似ています。ただし、ステートレス・セッションBeanと異なり、Message-Driven Beanにはインタフェースがなく、Beanクラスのみがあります。クライアントからのアクセスにインタフェースは使用されません。
Message-Driven Bean(MDB)はリスナーとして動作し、メッセージが特定の宛先に到着すると、アプリケーション・コード・ブロックを実行します。MDBを有効に活用するには、EJB参照を利用する必要があります。