WebObjectsでは複雑に絡み合っているオブジェクトが多く、各クラスの役割がわかっても実際にどう動いているのか、どうアクセスすればいいのかがわかりにくい面があります。WebObjectsは難しい、敷居が高いと言われることがありますが、この多重度がフレームワークの理解を阻む壁の一つではないでしょうか。そこで、主要なクラスであるアクセスレイヤーとコントロールレイヤーのクラス間の多重度を整理することで、全体の流れを把握する手助けにしたいと思います。次のように、各クラスをレイヤーと役割に応じて場所と色を変えています。太い枠で囲まれているクラスは、アプリケーションごとに1つのインスタンスが用意されます。アクセスレイヤーのクラスは大きく3つに分けられます。データベースに接続し操作するアダプタレベル、データベース操作を抽象化するデータベースレベル、データベースをオブジェクトにマッピングするモデルクラスです。わかりやすいモデルクラスから見ていきましょう。モデルの中心となるのはEOModel、エンティティや属性などのマッピング情報をまとめるクラスです。EOModelはデータベースごとに用意されます。このクラスのオブジェクトを用意するのが、名前の通りの開発ツールのEOModelerです。EOStoredProcedureは、これも名前の通りの要素をマッピングするおなじみのクラスです。EORelationshipはリレーション元とリレーション先の属性を指定したEOJoinを複数持ちます。EOModelGroupはEOModelを一元管理します。管理するEOModelとEOEntityを取得するメソッドが用意されており、モデルオブジェクトにアクセスするならEOModelGroupをたどるのが簡単です。EOF上でこのデータベースにあたるのがEOAdaptorとその関連クラスです。データベース操作はアダプタレベル、データベースレベル、コントロールレイヤーと三重に抽象化され、通常アダプタレベルまで気にすることはありません。EOAdaptorはデータベースへ接続するための情報を管理します。アダプタレベルの各クラスから参照されます。EOModelはEOAdaptorを1つ利用しますが、複数のEOModelから同じEOAdaptorを参照できます。EOModelerで言うと、モデルファイルはデータベースごとに用意されることになりますが、複数のモデルファイルで同じデータベースを使うことができます。EOAdaptorChannelはデータベースと接続する通信チャネル、EOAdaptorContextはトランザクションを操作するクラスです。データベースレベルのクラスと深く関わってきます。データベースレベルのクラスはアダプタレベルと対応しており、多重度だけで見るとアダプタレベルから独立しているように見えますが、単純なラッパーではありません。EODatabaseContextにアクセスするときは注意してください。実際はEODatabaseContextがアダプタレベルのオブジェクトを直接使っているようです。多重度はアダプタレベルとほぼ同じです。Operationクラスの多重度が異なりますが、EOAdaptorOperationはEODatabaseOperationのデータベース操作命令から、具体的なデータベース処理を組み立てるためです。EOAdaptorOperationがEOSQLExpressionに変換され、データベースにSQL文が送られます。このレイヤーに普段EOFを操作するのに使う多くのクラスがあります。中でも重要なのはEOObjectStoreCoordinator、EOEditingContext、EOEnterpriseObjectの関係と、EOEnterpriseObject、EOGlobalID、スナップショット(特別なクラスではありませんが)の関係です。各EOEnterpriseObjectは1つのEOEditingContextに所属し、各EOEditingContextは1つのEOObjectStoreCoordinatorに所属します。EOGlobalID、スナップショットとEOEnterpriseObjectは1対多の関係です。これは実際には、EOEnterpriseObjectはスナップショットのコピーに相当し、各コピーはEOEditingContextに1つずつ所属するということになります。