http://java.sun.com/products/jdo/JDOCMPFAQ.htmlより:

EJB 2.0のCMPとJDO

---Mark Hapner, Craig Russell

Q:CMP(Container Managed Persistence)って何?。そしてJava Data Objects(JDO)って何?。
A:EJB 2.0のCMPは、J2EEのコンポーネントモデルの一環であり、EJBコンテナのためのオブジェクトのパーシステント(化)サービスを提供するものなんだ。CMPの目標は、パーシステントなビジスネコンポーネントを実装するための標準的な仕組みを提供することさ。ただしCMPは、Javaプラットホームの標準的なパーシステンス機能ではないね。CMPは、パーシステントなデータへの、分散的&トランザクション的&セキュアなアクセスを提供する仕組みであり、しかもポータブルなインタフェイスであることが保証されているんだ。CMPでは、一連のset/getメソッドを使ってデータにアクセスするね。だから、Javaのインスタンス変数のパーシステンスを透明にサポートするものではないんだよ。

  一方JDOは、Javaのオブジェクトそのもののパーシステンスを透明にサポートするための標準的な方法を備えているアーキテクチャなんだ。JDOは、エンタプライズアーキテクチャ(企業向けの本格的な実用システム)のマルチチヤ(multi tiers,多層的システム構造)の中で使えるように、設計されている。たとえばそれは、J2SE/Web/アプリケーションサーバといった、複数の層だ。JDO自身は、分散オブジェクトや分散トランザクションやセキュリティ機能などを備えていないが、これらのサービスを提供するEJBコンテナと一緒に使えばいいだろうね。CMPは分散コンポーネントのパーシステンスをサポートするものであり、しかも、あくまでもエンティティビーン専用だね。これれ対してJDOは、オブジェクトのタイプを特定しないんだ。分散ではなく、ローカルな、多様なオブジェクトモデルに向いている。だから、オブジェクトのパーシステンスか、エンティティビーンコンポーネントのパーシステンスか、という要求の違いに応じて、デベロッパはJDOとCMPを使い分けてほしいんだ。

Q:EJBコンテナの中で必要なパーシステンスというと、ビジネスコンポーネントのパーシステンスだけで十分じゃないの?。
A:ビジネスコンポーネントのパーシステンスはもちろん重要だが、J2EEアプリケーションの中にはそのほかにもパーシステンスが必要な場面があるね。まだまだ、JDBCからSQLを使うアプリケーションは多いだろうし、またその反面、JDOのような透明なパーシステント化の仕組みを使ってパーシステントデータを直接管理するアプリケーションも今後は増えるよ。そうすると、セッションビーンがパーシステントデータに直接アクセスできるようになるし、また、エンティティビーンがJDOやネイティブなSQLやそのほかの独自な方法によるBMP(Bean Managed Persistence)を使うこともできるね。

Q:JDOとEJBはどうやって一緒に使うの?。
A:JDOはEJBを補完する立場なんだ。JDOをセッションビーンの層の裏で使うことによって、Javaのプレーンな(=EJB以外の)ビジスネオブジェクトのパーシステンスを透明に支えてもいい。またJDOは、BMPエンティティビーンの実装にも使える。あるいは、CMPエンティティ用のコンテナの実装にも使えるね。

  JDOのPersistenceManagerFactoryの構成テクニックは、JDBCのDataSourceと同じく、Javaビーンのset/getのパターンだよ(javax.jdo.PersistenceManagerFactoryのjavadocを見よ)。EJBコンテナの外では、JDOは自分自身のトランザクション補完機構を使う。コンテナの中では、JDOはEJBコンテナのトランザクション補完機構を使う。このことは、JDBCのConnectionと似ている…これもやはり、EJBコンテナの中と外では動作が違うからね。

  EJBがJDOに加えるものは、分散トランザクションの管理とセキュリティと分散実行だ。EJBの外で使うためのJDOのクラスなら、それらをEJBの中で使うために書き換えなくてもいい。つまり、そのJDOのクラスが、セッションビーンが必要とする機能を全部持っているのなら、わざわざエンティティビーンを使わなくてもいいのさ。

  わざわざエンティティビーンで(BMPの代理(delegate)クラスを使って)JDOのクラスをラップする(包む)必要があるとしたら、それは、セッションという門を通らずに直接、そのJDOのクラスにリモートでアクセスさせたい場合だ。そうするとJDOのクラスが、より高度な自律性と機能性を持つことになるね。

Q:CMPのパーシステンスモデルはJDOのに比べると貧弱に見えるけど?。
A:EJB 2.0のCMPは、EJB 1.1より高度だけど、やはり保守的なモデルだよね。目標があくまでも、アプリケーションのポータビリティ(可搬性)と、ベンダの実装のしやすさだから。それに対してJDOや、JDBCを直接使う方法や、そのほかのJavaによるオブジェクト/リレーショナル製品は、CMPよりも豊富な機能性を提供している場合が多いんだ。J2EEサーバのCMPの実装にJDOを使ったとしたら、JDOにあってCMPにないという機能が死んでしまうね。

Q:CMPの質問言語EJBQLはSQLに酷似しているけど…?。
A:EJBのCMPは、コンテナの機能性のほとんどすべてを、背後のRDMBS(関係データベース管理システム)に委任できるように設計されているんだ。EJBのエキスパートグループのメンバは主にJ2EEのベンダたちだし、EJBのCMPの仕様を決めているのも、彼らなんだ。そして、EJBコンテナを使っているデータベースといえば、その圧倒的多くが関係データベースだよ。だからEJBQLとSQLは、ほとんど同じであるほうが便利だ、と考えられているのさ。

Q:CMPが好きな人は自分から関数(メソッド)を使うのが好きで、JDOが好きな人は透明なパーシステンスが好き、と言ってもいいのかな?。
A:パーシステンスを関数(メソッド)として提供するか、透明に提供するか、については長年の議論があるんだよ。CMP vs. JDOという話題も、その議論の一環だね。EJBのエキスパートグループは、EJBの関数(メソッド)方式のパーシステンスを要求として受け入れるつもりのようだ。プログラマにとって透明なパーシステンスではなくて、ね。

Q:透明なパーシステンスがJ2EEに取り入れられる見込みはないの?。
A:透明なパーシステンスは、EJBのエキスパートグループが要求として受け入れないだろうね。でも一部のJ2EEベンダは、CMPの実装にJDOを使うかもしれないよ。

Q:J2EEでパーシステンスをサポートするためのツールはあるの?。
A:J2EEの目標は、アプリケーションのデベロッパたちが非常に多様なツールを使えることだ。それらのツールの中には、J2EEのさらに上の層でツール固有のパーシステンスを提供するものがあるかもしれない。あるいは、J2EEのコネクタを使って、オプション的なパーシステンス機能を提供するものがあるかもしれない。J2EEの今後のバージョンは、CMPのプラグインインタフェイスを定義するだろうから、そうなると、ツールによってCMPを拡張するのも容易になるね。

Q:SQLJやJDOは、J2EEプラットホームの要求に含まれるだろうか?。
A:SQLJもJDOも熱心なサポーターがいるし、どちらも、J2EEのパーシステンスオプションとして本格的に使える。ただし、現時点では、この二つをJ2EE本体に含めるという要求は、J2EEのベンダたちの間であまりないね。