EJB 2.0 仕様では CMP が強化され、複数のエンティティー Bean 間で関係を持たせることが可能になりました。これは、コンテナ管理による関係 (CMR) と呼ばれます。コンテナによって、関係および関係の参照整合性を管理します。
EJB 1.1 仕様で提供されていた CMP モデルにはより多くの制限がありました。EJB 1.1 アーキテクチャーにおける CMP は、データベースやリソースマネージャーのタイプに依存しないデータアクセスに制限されていました。リモートインタフェースを通して公開できるのは、エンティティー Bean のインスタンス状態のみで、Bean の関係を公開する方法はありませんでした。EJB 1.1 バージョンの CMP は、エンティティー Bean クラスのインスタンス変数をデータベースまたはリソースマネージャー内でこれらの状態を表すデータ項目へマッピングすることに依存しています。CMP のインスタンスフィールドは配備記述子内で指定されます。Bean が配備されると、デプロイヤはツールを使用して、インスタンスフィールドのデータ項目に対するマッピングを実装するコードを生成します。
Bean の実装クラスのコーディング方法を変更する必要もあります。EJB 2.0 仕様では、CMP を使用するエンティティー Bean の実装クラスは、抽象クラスとして定義されるようになります。
この節では、次の項目について説明します。
EJB 2.0 仕様では、エンティティー Bean のインスタンス変数を CMP フィールドまたは CMR フィールドとして指定することが可能です。これらのフィールドは配備記述子内に定義します。CMP フィールドは cmp-field という要素でマークされ、コンテナ管理による関係フィールドは cmr-field という要素でマークされます。
実装クラスでは、CMP および CMR フィールドを public 変数として宣言しないように注意してください。その代わりに、これらの CMP および CMR フィールドの値を取得および設定するには、エンティティー Bean 内に get および set メソッドを定義します。この意味で、2.0 CMP を使用する Bean は JavaBeans モデルに従っていると言えます。クライアントは、インスタンス変数に直接アクセスするのではなく、エンティティー Bean の get および set メソッドを使用して、これらのインスタンス変数を取得および設定しているからです。get および set メソッドが関連するのは、CMP または CMR フィールドに指定された変数のみであることに注意してください。
前述のとおり、EJB 1.1 アーキテクチャーはエンティティー Bean 間の CMR をサポートしていません。EJB 2.0 アーキテクチャーでは、1 対 1 と 1 対多の両方の CMR がサポートされています。これらの関係は CMR フィールドによって表され、これらのフィールドは配備記述子内で関係としてマークされます。配備記述子内の CMR フィールドは、各アプリケーションサーバーに適した配備ツールを使用して設定します。
CMP フィールドと同じように、Bean では CMR フィールドをインスタンス変数として宣言しません。その代わり、Bean ではこれらのフィールドに対して get および set メソッドが提供されています。
メッセージ駆動型 Bean は、EJB 2.0 アーキテクチャーによって導入されたもう 1 つの新機能です。メッセージ駆動型 Bean は、JMS (Java Message Service) を通して配信された非同期メッセージを処理するトランザクション対応のコンポーネントです。JMS API は J2EE 1.3 および J2EE 1.4 プラットフォームに不可欠な部分です。
非同期メッセージではアプリケーションがメッセージ交換によって通信できるため、送信者は受信者と無関係となります。メッセージを送信した送信者は、受信者がそのメッセージを受信または処理するのを待機する必要はありません。ここが同期通信と異なっている点です。同期通信では、別のコンポーネントのメソッドを呼び出しているコンポーネントは、処理が完了し、呼び出し元のコンポーネントにコントロールが戻って来るまで、待機またはブロックする必要があります。