(57)【要約】  本開示は、オブジェクト関係マッピングで使用されるコード生成パターンに関する。このコードパターンは、両方向リレーションシップを管理し、整合性を保証するのに使用することができる。このコードパターンは、リレーショナルデータのオンデマンドローディングまたは延期されたローディングをサポートすることができる。変更の検出および追跡も提供される。さらに、デフォルトメンバモディファイヤは、開発者が、生成されたソースコードを直接に修正せずに、ツールによって生成されたソースコードをオーバーライドすることを可能にする。
2009507269.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ生成オブジェクト関係マッピングシステムであって、
第２データオブジェクトコンポーネントに対応するオブジェクト情報を含む第１データオブジェクトコンポーネントと、
前記第１データオブジェクトコンポーネントに対応するオブジェクト情報を含む前記第２データオブジェクトコンポーネントと、
を含み、前記第１または第２のデータオブジェクトコンポーネントのうちの一方は、前記対応するオブジェクト情報の変化について、前記第１または第２のデータオブジェクトコンポーネントのうちの他方に通知する
ことを特徴とするシステム。
【請求項２】
前記第１データオブジェクトコンポーネントの前記オブジェクト情報は、少なくとも１つのデータオブジェクトコンポーネントを含む第１コンテナコンポーネントを含み、前記第２データオブジェクトコンポーネントの前記オブジェクト情報は、少なくとも１つのデータオブジェクトコンポーネントを含む第２コンテナコンポーネントを含み、前記第１および第２のコンテナコンポーネントは、前記第１および第２のデータオブジェクトコンポーネントの間の両方向リレーションシップを管理することを特徴とする請求項１に記載のシステム。
【請求項３】
前記第１データオブジェクトコンポーネントの前記オブジェクト情報は、前記第２データオブジェクトコンポーネントへの参照を含む第１コンテナコンポーネントを含み、前記第２データオブジェクトコンポーネントの前記オブジェクト情報は、前記第１データオブジェクトコンポーネントへの参照を含む第２コンテナコンポーネントを含み、前記第１および第２のコンテナコンポーネントは、前記第１および第２のデータオブジェクトコンポーネントの間の両方向リレーションシップを管理することを特徴とする請求項１に記載のシステム。
【請求項４】
前記第１データオブジェクトコンポーネントの前記オブジェクト情報は、前記第２データオブジェクトコンポーネントへの参照を含む第１コンテナコンポーネントを含み、前記第２データオブジェクトコンポーネントの前記オブジェクト情報は、少なくとも１つのデータオブジェクトコンポーネントを含む第２コンテナコンポーネントを含み、前記第１および第２のコンテナコンポーネントは、前記第１および第２のデータオブジェクトコンポーネントの間の両方向リレーションシップを管理することを特徴とする請求項１に記載のシステム。
【請求項５】
前記第１および第２のデータオブジェクトコンポーネントのそれぞれは、デリゲート関数を含む通知コンポーネントを含むことを特徴とする請求項１に記載のシステム。
【請求項６】
前記第１データオブジェクトコンポーネントは、前記第１データオブジェクトコンポーネントの前記オブジェクト情報への参照をインターセプトし、前記第１データオブジェクトコンポーネントの前記オブジェクト情報をデータストレージコンポーネントから取り出すローディングコンポーネントを含むことを特徴とする請求項１に記載のシステム。
【請求項７】
前記第１および第２のデータオブジェクトコンポーネントのそれぞれは、前記第１または第２のデータオブジェクトコンポーネントの修正の前に変更検出コンポーネントに通知する変更通知コンポーネントを含むことを特徴とする請求項１に記載のシステム。
【請求項８】
前記変更通知コンポーネントは、イベントハンドラを利用することを特徴とする請求項７に記載のシステム。
【請求項９】
前記変更検出コンポーネントは、修正の前の各修正されたデータオブジェクトコンポーネントの内容のコピーを含む修正されたデータオブジェクトコンポーネントのリストを含むことを特徴とする請求項７に記載のシステム。
【請求項１０】
オブジェクトモデルにマッピングされるリレーショナルデータを管理する方法であって、
第１データオブジェクトコンポーネントに対応するオブジェクト情報を含む第２データオブジェクトコンポーネントに対応するオブジェクト情報を含む前記第１データオブジェクトコンポーネントを更新することと、
前記第１データオブジェクトコンポーネントの前記更新について前記第２データオブジェクトコンポーネントに通知することと、
前記第１データオブジェクトコンポーネントの前記更新に基づいて前記第２データオブジェクトコンポーネントを更新することと
を含むことを特徴とする方法。
【請求項１１】
前記第１データオブジェクトコンポーネントの前記オブジェクト情報への参照をインターセプトすることと、
前記第１データオブジェクトコンポーネントの前記オブジェクト情報をデータストレージコンポーネントから取り出すことと、
前記第１データオブジェクトコンポーネントの前記オブジェクト情報に前記取り出されたオブジェクト情報を投入することと
をさらに含むことを特徴とする請求項１０に記載の方法。
【請求項１２】
前記第１データオブジェクトコンポーネントを更新する前に変更検出コンポーネントに通知すること
をさらに含むことを特徴とする請求項１０に記載の方法。
【請求項１３】
前記第１データオブジェクトコンポーネントを更新する前に前記第１データオブジェクトコンポーネントをコピーすることと、
前記第１データオブジェクトコンポーネントの前記コピーを、修正されたデータオブジェクトコンポーネントのリストに格納することと
をさらに含むことを特徴とする請求項１２に記載の方法。
【請求項１４】
修正されたデータオブジェクトコンポーネントの前記リストからデータオブジェクトコンポーネントを取り出すことと、
前記取り出されたデータオブジェクトコンポーネントを前記データストレージコンポーネント内の対応するデータと比較することと、
前記取り出されたデータオブジェクトコンポーネントに対応する前記更新されたデータオブジェクトコンポーネントを突き止め、前記更新されたデータオブジェクトコンポーネントを前記データストレージコンポーネントに格納することと
をさらに含むことを特徴とする請求項１３に記載の方法。
【請求項１５】
データストレージコンポーネントによって利用されるリレーショナルデータテーブルを判定することと、
前記データストレージコンポーネントによって利用される前記リレーショナルデータテーブルに対応するデータオブジェクトテーブルをジェネリッククラスを使用してインスタンス化することと
を含むことを特徴とする請求項１０に記載の方法。
【請求項１６】
請求項１０に記載の方法を実行するコンピュータ実行可能命令をその上に格納されることを特徴とするコンピュータ可読媒体。
【請求項１７】
少なくとも２つの別々の位置で宣言されるソースコードをコンパイルする方法であって、
少なくとも１つのデフォルトクラスメンバを識別することと、
前記少なくとも１つのデフォルトクラスメンバに対応する非デフォルトクラスメンバを前記ソースコードから検索することと、
前記対応する非デフォルトメンバが見つかった場合には前記対応する非デフォルトメンバを利用し、対応する非デフォルトメンバが存在しない場合には前記デフォルトクラスメンバを利用して、前記ソースコードから実装コードを生成することと
を含むことを特徴とする方法。
【請求項１８】
前記デフォルトクラスメンバは、ブループリントを使用して生成されることを特徴とする請求項１７に記載の方法。
【請求項１９】
前記デフォルトクラスメンバは、コード生成ツールを使用して生成されることを特徴とする請求項１７に記載の方法。
【請求項２０】
請求項１７に記載の方法を実行するコンピュータ実行可能命令をその上に格納されることを特徴とするコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オブジェクト関係マッピングで使用されるコード生成パターンに関する。
【背景技術】
【０００２】
メモリおよび処理能力の継続的向上に起因して、コード生成が、プログラマの生産性を高める一般的な方法になってきた。近年、コードジェネレータの人気が高まった。コードジェネレータは、ソースレベル言語コード（例えば、Ｃ、Ｃ＃、Ｖｉｓｕａｌ  Ｂａｓｉｃ、Ｊａｖａ（登録商標）．．．）を自動的に生成する。自動生成されたコードを使用することによって、開発時間を減らし、コードの安定性を高めることができる。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
具体的に言うと、コード生成は、オブジェクト関係マッピング（ＯＲＭ）のコンテキストで人気を得てきた。リレーショナルデータストレージシステム（例えば、ＤＢ２、ＳＱＬ  Ｓｅｒｖｅｒ、ＭｙＳＱＬ、．．．）が、リレーショナルデータを格納し、リレーションシップを管理するのに利用される。ソースレベル言語で開発されたソフトウェアが、リレーショナルデータストレージシステムに格納されたリレーショナルデータにアクセスし、これを操作することが有用である。アプリケーションソフトウェアは、リレーショナルデータを管理しているときに、データに固有のリレーションシップを維持しなければならない。さらに、リレーショナルデータに対する変更または修正のすべてを、リレーショナルデータストレージシステムに戻って永続させなければならない。
【課題を解決するための手段】
【０００４】
次は、請求される主題のいくつかの態様の基本的理解をもたらすために、単純化された要約を提示するものである。この要約は、広範囲の概要ではない。主要な／クリティカルな要素を識別すること、または請求される主題の範囲を区切ることは、意図されていない。この要約の唯一の目的は、後で提示されるより詳細な説明の前置きとして、単純化された形でいくつかの概念を提示することである。
【０００５】
短く説明すると、提供される主題は、機械生成されるソースに関する。より具体的には、この主題は、データリレーションシップを管理しながらのオブジェクトモデルへのリレーショナルデータのマッピングに関連する機械生成されるソースコードに関する。データオブジェクト間の両方向リレーションシップを提供するコード生成パターンを説明する。
【０００６】
生成されるオブジェクトモデルは、データストレージシステムからのリレーショナルデータのオンデマンドローディングまたは延期されたローディングをサポートすることができる。このオブジェクトモデルは、ジェネリック型を利用して、データストレージシステムデータテーブルに対応するデータテーブルのセットを作成することができる。これは、オブジェクトモデルにマッピングされたデータストレージシステムデータテーブルごとにデータテーブルを含むクラスとしてデータストレージシステムを表すことを可能にする。
【０００７】
このオブジェクトモデルは、データストレージシステムからプルされたデータに対する変更を検出し、追跡することができるものとすることもできる。このシステムは、更新データを識別し、修正されたデータストレージシステムデータの上書きを防ぐ効率的な方法を提供する。
【０００８】
さらに、デフォルトメンバモディファイヤが提供される。デフォルトモディファイヤは、ソースコードを直接に修正せずに、ツールによって生成されたソースコードをオーバーライドする能力を開発者に与える。
【０００９】
前述の目的および関連する目的の達成に向かって、請求される主題のある種の例示的態様を、次の説明および添付図面に関して本明細書で説明する。これらの態様は、この主題を実践できる様々な形を示し、そのすべてが請求される主題の範囲に含まれることが意図されている。他の利益および新規の特徴は、図面と共に考慮されるときに、次の詳細な説明から明白になる可能性がある。
【発明を実施するための最良の形態】
【００１０】
本発明の様々な態様を、これから、添付図面を参照して説明するが、添付図面では、類似する符号が、複数の図面を通じて類似するまたは対応する要素を指す。しかし、図面およびそれに関連する詳細な説明が、請求される主題を特定の開示される形態に限定することは、意図されていないことを理解されたい。そうではなく、その意図は、請求される主題の趣旨および範囲に含まれるすべての修正形態、同等物、および代替形態を含むことである。
【００１１】
本明細書で使用される用語「コンポーネント」、「システム」、および類似物は、ハードウェア、ハードウェアおよびソフトウェアの組合せ、ソフトウェア、または実行中のソフトウェアのいずれであれ、コンピュータ関連エンティティを指すことが意図されている。例えば、コンポーネントは、プロセッサ上で動作しているプロセス、プロセッサ、オブジェクト、実行可能ファイル、実行のスレッド、プログラム、および／またはコンピュータとすることができるが、これらに限定はされない。例えば、コンピュータで動作しているアプリケーションとそのコンピュータとの両方を、コンポーネントとすることができる。１つまたは複数のコンポーネントが、１つのプロセスおよび／または実行のスレッドの中に存在することができ、１つのコンポーネントを、１つのコンピュータに局所化し、かつ／または複数のコンピュータの間で分散させることができる。
【００１２】
単語「例示的」は、本明細書では、例、実例、または例示として働くことを意味するのに使用される。本明細書で「例示的」として説明されるすべての態様または設計は、必ずしも、他の態様または設計より好ましいまたは有利とは解釈されない。さらに、提供される例は、Ｃ＃プログラミング言語を利用するが、多数の代替のプログラミング言語を使用することができる。
【００１３】
さらに、開示される主題は、本明細書で詳細に説明される諸態様を実施するためにコンピュータまたはプロセッサベースのデバイスを制御するためにソフトウェア、ファームウェア、ハードウェア、またはその任意の組合せを作るのに標準プログラミングおよび／またはエンジニアリング技法を使用することによってシステム、方法、装置、または製造品として実施することができる。本明細書で使用される用語「製造品」（またはその代わりに「コンピュータプログラム製品」）は、任意のコンピュータ可読デバイス、搬送波、または媒体からアクセス可能なコンピュータプログラムを含むことが意図されている。例えば、コンピュータ可読媒体は、磁気ストレージデバイス（例えば、ハードディスク、フロッピー（登録商標）ディスク、磁気ストリップ．．．）、光ディスク（例えば、コンパクトディスク（ＣＤ）、デジタル多用途ディスク（ＤＶＤ）．．．）、スマートカード、およびフラッシュメモリデバイス（例えば、カード、スティック）を含むことができるが、これらに限定はされない。さらに、搬送波を使用して、電子メールの送信および受信またはインターネットもしくはローカルエリアネットワーク（ＬＡＮ）などのネットワークへのアクセスに使用されるものなどのコンピュータ可読電子データを搬送できることを了解されたい。もちろん、請求される主題の範囲または趣旨から逸脱せずに、この構成に対して多数の変更を行うことができることを、当業者は認めるであろう。
【００１４】
Ｉ．デフォルトメンバモディファイヤ
ここで図１を参照すると、一般に、プログラマは、コード生成ツールまたはソースコードジェネレータを使用して、プログラムの初期構造を作り、その後、生成されたソースコードを修正する。しかし、ソフトウェア開発中にコードをもう一度生成する必要がある場合には、生成されたコードに対する開発者の変更が、上書きされる。その結果、開発者は、別々のソースコードファイルを作成する場合がある。あるソースレベル言語は、別々のソースファイルを使用することによって、生成されたコードの修正を容易にする。例えば、Ｃ＃は、クラスおよびインターフェースを複数の部分に分離し、別々のソースファイルに分離することを可能にする部分型を提供する。ツールによって生成された部分クラスを、開発者が記述した部分クラスとコンパイル中にマージすることができ、その結果、各部分クラスを独立に作成し、維持することができるようになる。図１に、コンパイルシステムを示す。コンパイル中に、開発者ソースコード１０２および生成されたソースコード１０４が、コンパイラコンポーネント１０６によって組み合わされる。結果の実装コード１０８（例えば、実行可能ファイル、中間言語．．．）は、開発者ソースコード１０２および生成されたソースコード１０４が単一のユニット内で記述された場合と同一である。
【００１５】
部分クラスは、ツールによって生成されたソースコードで宣言された部分クラスにメンバを追加する能力をソフトウェア開発者に与えるが、開発者が生成されたソースコードで宣言されたメンバを修正することは可能にしない。部分クラスのメンバは、生成されたコードまたは開発者コードのいずれかで宣言できるが、両方で宣言することはできない。あるメンバが、ある部分クラスについて複数回宣言される場合に、コンパイラは、衝突を生成する。
【００１６】
コードジェネレータは、デフォルトクラスメンバモディファイヤを提供することができる。デフォルトメンバモディファイヤは、そのメンバ宣言が、非デフォルトメンバ宣言がない場合に使用されることを示す。その結果、デフォルトメンバを非デフォルトクラスメンバによって上書きすることができる。これは、コンパイル中に衝突を生成せずに、部分クラスのツールによって生成されたメンバを修正する機構をソフトウェア開発者に与える。
【００１７】
図２は、デフォルトメンバを処理する方法２００を示す流れ図である。符号２０２で開始して、コンパイラは、ソースコードを受け取る。ソースコードは、コード生成ツール、ソフトウェア開発者、またはその両方によって作成することができる。２０４で、デフォルトメンバモディファイヤを検出する。コンパイラは、部分クラス内のデフォルトメンバを見つけたときに、２０６で、そのデフォルトメンバをオーバーライドする、そのクラスの同一の名前を有するメンバがあるかどうかを判定する。オーバーライドするメンバは、開発者が作成した別々のソースファイル内にある場合がある。非デフォルトメンバまたはオーバーライドするメンバがある場合には、２０８で、コンパイラは、オーバーライドするメンバのソースコードを利用し、デフォルトソースコードを無視する。２１２で、オーバーライドするソースコードを使用して、実装コードを生成する。しかし、オーバーライドするコードがまったくない場合には、２１０で、デフォルトソースコードを利用し、２１２で、実装コードにデフォルトソースコードを組み込む。このコンパイルプロセスは、２１４で終了する。
【００１８】
生成されたソースコードファイルＣｕｓｔｏｍｅｒ１．ｃｓ内の次のＣ＃クラス宣言を検討されたい。
【００１９】
【表１】
2009507269.tif 000003
【００２０】
部分クラスＣｕｓｔｏｍｅｒが、宣言され、３つのデフォルトメンバすなわちＮａｍｅ、Ｓｔａｔｕｓ、およびＣｏｍｐｕｔｅＤｉｓｃｏｕｎｔを含む。Ｃｕｓｔｏｍｅｒのメンバを修正することを望むソフトウェア開発者は、別々のソースファイル、例えばＣｕｓｔｏｍｅｒ２．ｃｓ内で、次の部分クラスＣｕｓｔｏｍｅｒを宣言することができる。
【００２１】
【表２】
2009507269.tif 000004
【００２２】
ここで、この開発者は、Ｎａｍｅメンバを定義していない。したがって、生成されたコードで定義されたデフォルトのＮａｍｅメンバが、コンパイラによって利用される。この開発者は、プロパティメンバＳｔａｔｕｓおよびメソッドメンバＣｏｍｐｕｔｅＤｉｓｃｏｕｎｔを定義した。この２つのメンバは、生成されたソースコードで宣言された部分クラスＣｕｓｔｏｍｅｒのメンバと名前において同一であるが、異なるロジックまたは追加のロジックを含む。デフォルトメンバモディファイヤのゆえに、ソフトウェア開発者のソースコードで宣言されたメンバが、生成されたコードのプロパティおよびメソッドより優先される。デフォルトメンバモディファイヤは、開発者が、生成されたソースコードファイルを直接に修正せずに、生成されたコード内のクラスメンバをオーバーライドすることを可能にする。
【００２３】
デフォルトメンバモディファイヤは、ブループリント（ｂｌｕｅｐｒｉｎｔ）と共に利用することもできる。本明細書で使用されるときに、ブループリントは、ソースコードに変換できる宣言型言語文書（例えば、拡張マークアップ言語（ＸＭＬ））である。ブループリントを使用して生成されるすべての部分クラスメンバは、デフォルトモディファイヤが明示的にオフに切り替えられていない限り、自動的にデフォルトモディファイヤを伴って指定することができる。次の例示的ブループリントを検討されたい。
【００２４】
【表３】
2009507269.tif 000005
【００２５】
デフォルトモディファイヤは、Ｃｕｓｔｏｍｅｒ  ＮａｍｅプロパティのｄｅｆａｕｌｔＭｏｄｉｆｉｅｒなどの属性を指定することによって、望まれる場合に明示的にオフに切り替えることができる。代替案では、ブループリントを使用して生成される部分クラスメンバを、デフォルトモディファイヤが明示的にオンに切り替えられていない限り、デフォルトを使用しないように自動的に指定することができる。
【００２６】
ＩＩ．リレーションシップ管理用のコード生成パターン
ここで図３を参照すると、ツールによって生成されるコードは、頻繁にＯＲＭシステムで使用される。図３に示されているように、ＯＲＭシステム３００には、アプリケーションコンポーネント３０４とデータストレージコンポーネント３０６との間のインターフェースとして働くＯＲＭコンポーネント３０２を含めることができる。リレーショナルデータは、アプリケーションコンポーネント３０４による使用のために、データストレージコンポーネント３０６から取り出し、ＯＲＭコンポーネント３０２によって管理することができる。
【００２７】
従来のＯＲＭシステムは、リレーションシップ管理を適当に提供することができない。一般に、問題がある３つのリレーションシップタイプすなわち、１対１、１対多、および多対多がある。１対１リレーションシップでは、タイプＡの各エンティティが、タイプＢの正確に１つのエンティティとのリレーションシップを有し、タイプＢのエンティティは、タイプＡのエンティティとの対応するリレーションシップを有する。例えば、単純な在庫システムでは、各カスタマＡが、一意のクレジットカード番号を有し、各クレジットカード番号は、正確に１人のカスタマを関連付けられる。１対多リレーションシップでは、タイプＡの単一のエンティティが、タイプＢの１つまたは複数のエンティティとのリレーションシップを有し、タイプＢの各エンティティは、タイプＡの単一のエンティティに関連する。例えば、在庫システムで、あるカスタマが、１つまたは複数の注文を行うことができ、各注文は、その注文を行った単一のカスタマに関連する。最後に、多対多リレーションシップでは、タイプＡのエンティティが、タイプＢの複数のエンティティとのリレーションシップを有することができ、タイプＢの各エンティティが、タイプＡの複数のエンティティとのリレーションシップを有することができる。例えば、注文を、複数の製品について行うことができ、単一の製品を、複数の注文に含めることができる。
【００２８】
一般に、オブジェクト指向言語は、リレーショナルデータを管理し、リレーションシップの整合性を保証するツールをソフトウェア開発者に提供しない。例えば、カスタマ注文リレーションシップなどの１対多リレーションシップに関するデータが、オブジェクト指向ソースコードを使用してマッピングされるときに、そのデータは、しばしば、次のＣ＃クラス宣言で示されるようにマッピングされる。
【００２９】
【表４】
2009507269.tif 000006
【００３０】
ここで、このソースコードは、宣言することによって、Ｃｕｓｔｏｍｅｒメンバを有するＯｒｄｅｒクラスおよびメンバＯｒｄｅｒｓを有するＣｕｓｔｏｍｅｒクラスを含み、ここで、Ｏｒｄｅｒｓは、Ｃｕｓｔｏｍｅｒのインスタンスに関連する注文のリストである。上に示したＣｕｓｔｏｍｅｒクラスおよびＯｒｄｅｒクラスのインスタンスにリレーショナルデータを投入することができるが、これらのクラスは、オブジェクト間のリレーションシップの整合性を要求することができない。開発者のコードが、対応する注文についてＣｕｓｔｏｍｅｒメンバを更新せずにＣｕｓｔｏｍｅｒインスタンスの注文を修正するのを防ぐ機構は、ない。オブジェクトにリレーショナルデータを投入するときに、オブジェクトがリレーショナルデータとの整合性を有することを保証するのは、プログラマの責任である。同様に、注文などのオブジェクトが除去されるときに、プログラマは、すべての関連するリレーションシップが更新されることを保証する責任を負う。あるＯｒｄｅｒが削除される場合に、そのＯｒｄｅｒは、関連するＣｕｓｔｏｍｅｒの注文のリストから除去されなければならない。
【００３１】
ＯＲＭシステムは、下で説明するコード生成パターンを使用して、リレーションシップ整合性を強制しながら１対１、１対多、および多対多のリレーションシップをモデリングすることができる。このコード生成パターンには、リレーショナルデータを適当にモデリングするのに必要な両方向リレーションシップの強制を実現する、コンテナとも称するコンテナコンポーネントを含めることができる。データオブジェクトとも称する各データオブジェクトコンポーネント（例えば、Ｃｕｓｔｏｍｅｒ）に、リレーションシップ内の他のデータオブジェクト（例えば、Ｏｒｄｅｒ）に対応する情報を含むコンテナを含めることができる。データオブジェクトおよびコンテナは、１対１、１対多、および多対多のリレーションシップをモデリングするために対にして使用することができる。各コンテナに、データオブジェクト間のリレーションシップが修正される場合に、コンテナが対応するデータオブジェクトに通知することを可能にする、１つまたは複数の通知を含めることができる。
【００３２】
コンテナは、異なるタイプのオブジェクトについてインスタンス化できるジェネリッククラスとして実装することができる。コンテナには、データオブジェクトのセット（例えば、注文のセット）の集合体を含めることができる。データオブジェクトのセットを含むコンテナを、セットコンテナと称する。代替案では、コンテナに、データオブジェクトのセットではなく、データオブジェクトへの参照（例えば、注文に関するカスタマ名）を含めることができる。そのようなコンテナを、本明細書では参照コンテナ（ｒｅｆｅｒｅｎｃｅ  ｃｏｎｔａｉｎｅｒ）と称する。参照コンテナの対を使用して、１対１リレーションシップをモデリングすることができる。セットコンテナの対を使用して、多対多リレーションシップをモデリングすることができる。参照コンテナおよびセットコンテナの組合せを使用して、１対多リレーションシップをモデリングすることができる。
【００３３】
図４は、カスタマ注文リレーションシップを示すブロック図である。カスタマデータオブジェクト４０２は、注文データオブジェクト４０６に対応するオブジェクト情報を含むセットコンテナ４０４を有する。同様に、注文データオブジェクト４０６は、カスタマデータオブジェクト４０２に対応するオブジェクト情報を含む参照コンテナ４０８を有する。このセットコンテナには、セットコンテナ４０４に含まれるオブジェクト情報に対する変更が、通知を注文データオブジェクト４０６へ送らせるように、通知コンポーネント（図示せず）を含めることができる。同様に、この参照コンテナには、参照コンテナ４０８に含まれるオブジェクト情報に対する変更が、通知をカスタマデータオブジェクト４０２へ送らせるように、通知コンポーネント（図示せず）を含めることができる。次のＣ＃コードを検討されたい。
【００３４】
【表５】
2009507269.tif 000007
【００３５】
ここでは、あるカスタマに関連する注文のリストが、ＥｎｔｉｔｙＳｅｔクラスを使用してセットコンテナとして実装され、ある注文に関連するカスタマが、ＥｎｔｉｔｙＲｅｆクラスを使用して参照コンテナとして実装されている。ＥｎｔｉｔｙＳｅｔクラスおよびＥｎｔｉｔｙＲｅｆクラスは、下で詳細に説明する。
【００３６】
ＥｎｔｉｔｙＳｅｔの次の例示的実装を検討されたい。
【００３７】
【表６】
2009507269.tif 000008
【００３８】
ここでは、ジェネリッククラスＥｎｔｉｔｙＳｅｔが、型パラメータＴＥｎｔｉｔｙを有し、ＴＥｎｔｉｔｙは、１つのリストメンバと２つのメソッドメンバすなわちｏｎＡｄｄおよびｏｎＲｅｍｏｖｅとを含むクラスに制約されている。ＥｎｔｉｔｙＳｅｔコンストラクタは、２つのパラメータすなわち通知デリゲートｏｎＡｄｄおよびｏｎＲｅｍｏｖｅを有する。ＡｄｄメソッドおよびＲｅｍｏｖｅメソッドは、エンティティがＥｎｔｉｔｙＳｅｔコレクションに追加されるかこれから除去されるときに、通知のデリゲートｏｎＡｄｄおよびｏｎＲｅｍｏｖｅが呼び出されることを保証する。ＥｎｔｉｔｙＳｅｔのＡｄｄメソッドは、追加されるエンティティがヌルでないことを保証する基本的なエラーチェックを実行し、エンティティをエンティティのリストに追加し、その後、ｏｎＡｄｄメソッドを使用して、追加についてエンティティに通知する。同様に、ＥｎｔｉｔｙＳｅｔからエンティティを除去するために、Ｒｅｍｏｖｅメソッドは、除去されるエンティティがヌルでないことを保証する基本的なエラーチェックを実行し、エンティティをエンティティのリストから除去し、その後、ｏｎＲｅｍｏｖｅメソッドを使用して、除去についてエンティティに通知する。
【００３９】
ＥｎｔｉｔｙＳｅｔを使用して、あるカスタマの注文のコレクション用のセットコンテナを実装することができる。ＥｎｔｉｔｙＲｅｆを使用して、各注文に関連するカスタマを格納するのに使用される参照コンテナを実装することができる。ＥｎｔｉｔｙＳｅｔおよびＥｎｔｉｔｙＲｅｆを使用して実装されるコンテナは、１対多カスタマ注文リレーションシップを管理するために対にすることができる。ＥｎｔｉｔｙＲｅｆは、下でさらに詳細に述べる。今は、ＥｎｔｉｔｙＳｅｔのリレーションシップ管理を利用する、上で述べたカスタマ注文リレーションシップに関するＣｕｓｔｏｍｅｒクラスの次の例示的実装を検討されたい。
【００４０】
【表７】
2009507269.tif 000009
【００４１】
ここでは、ＥｎｔｉｔｙＳｅｔによって実装されるコンテナインフラストラクチャを使用して、ＣｕｓｔｏｍｅｒデータオブジェクトのＯｒｄｅｒｓのコレクションにＯｒｄｅｒを追加することができる。生成されるコードのうちでＯｒｄｅｒｓの追加および削除に関係する部分だけが、上に示されており、残りのコードは省略されている。
【００４２】
クラスＣｕｓｔｏｍｅｒは、注文データオブジェクトのコレクションを有するＥｎｔｉｔｙＳｅｔコンテナを含む。Ｃｕｓｔｏｍｅｒクラスは、メソッドａｔｔａｃｈ＿Ｏｒｄｅｒｓおよびｄｅｔａｃｈ＿Ｏｒｄｅｒｓを含み、これらのメソッドは、関連するＯｒｄｅｒエンティティのＣｕｓｔｏｍｅｒメンバを更新する。これらのメソッドのデリゲートが、パラメータとしてＥｎｔｉｔｙＳｅｔコンストラクタに渡される。したがって、上で定義したＥｎｔｉｔｙＳｅｔクラスのＡｄｄメソッドおよびＲｅｍｏｖｅメソッドは、これらのメソッドをｏｎＡｄｄおよびｏｎＲｅｍｏｖｅに使用する。
【００４３】
図５は、データオブジェクトリレーションシップを維持しながらデータオブジェクトを１対多リレーションシップに関するコンテナに追加するプログラミング方法５００の流れ図である。具体的に言うと、ここでは、上で述べたカスタマ注文の例のコンテキストでの注文の追加を述べる。符号５０２で、追加プロセスが開始される。呼び出しを行って、データオブジェクトのコレクションにデータオブジェクトを追加することができる。例えば、１つのＯｒｄｅｒであるＯｒｄ１を、呼び出し「Ｃｕｓｔ１．Ｏｒｄｅｒｓ．Ａｄｄ（Ｏｒｄ１）」によって、カスタマのインスタンスであるＣｕｓｔ１に追加することができる。５０４で、基本的なエラーチェックを実行して、追加されるデータオブジェクトがヌルであるかどうかを判定することができる。エラーがある場合には、５０６で例外を生成することができる。そうでない場合には、５０８で、データオブジェクトをデータオブジェクトのコレクションに追加することができる。データオブジェクトを追加した後に、５１０で追加の通知があり、５１２で、データオブジェクトを更新して、リレーションシップを反映させる。具体的に言うと、Ｏｒｄ１．ＣｕｓｔｏｍｅｒにＣｕｓｔ１をセットする。このプロセスは、５１４で終了する。
【００４４】
図６は、データオブジェクトリレーションシップを維持しながらデータオブジェクトを１対多リレーションシップに関するコンテナから除去するプログラミング方法６００の流れ図である。具体的に言うと、ここでは、上で述べたカスタマ注文の例のコンテキストでの注文の除去を述べる。符号６０２で、除去プロセスが開始される。呼び出しを行って、データオブジェクトのコレクションからデータオブジェクトを除去することができる。例えば、１つのＯｒｄｅｒであるＯｒｄ２を、呼び出し「Ｃｕｓｔ１．Ｏｒｄｅｒｓ．Ｒｅｍｏｖｅ（Ｏｒｄ２）」によって、カスタマのインスタンスであるＣｕｓｔ１から除去することができる。６０４で、基本的なエラーチェックを実行して、除去されるデータオブジェクトがヌルであるかどうかを判定することができる。エラーがある場合には、６０６で例外を生成することができる。そうでない場合には、６０８で、データオブジェクトをデータオブジェクトのコレクションから除去することができる。データオブジェクトを除去した後に、６１０で除去の通知があり、６１２で、データオブジェクトを更新して、リレーションシップを反映させる。具体的に言うと、Ｏｒｄ２．Ｃｕｓｔｏｍｅｒにヌルをセットする。このプロセスは、６１４で終了する。
【００４５】
参照コンテナには、データオブジェクトのコレクションではなくデータオブジェクトへの参照を含めることができる。参照コンテナは、より制限された形のセットコンテナと考えることができ、セットコンテナに存在するものと同一の通知を含む。参照コンテナは、１対１リレーションシップまたは１対多リレーションシップをマッピングするときに使用することができる。例えば、下でＥｎｔｉｔｙＲｅｆとして実装される参照コンテナを、ＥｎｔｉｔｙＳｅｔを使用して実装されるセットコンテナと共に使用して、上で述べたカスタマ注文リレーションシップをモデリングすることができる。Ｃ＃でのＥｎｔｉｔｙＲｅｆの次の例示的実装を検討されたい。
【００４６】
【表８】
2009507269.tif 000010
【００４７】
ここでは、ジェネリッククラスＥｎｔｉｔｙＲｅｆは、型パラメータＴＥｎｔｉｔｙを有し、ＴＥｎｔｉｔｙは、１つのエンティティメンバと２つのメソッドメンバすなわちｏｎＡｄｄおよびｏｎＲｅｍｏｖｅとを含むクラスに制約されている。ＥｎｔｉｔｙＲｅｆコンストラクタは、２つのパラメータすなわち通知デリゲートｏｎＡｄｄおよびｏｎＲｅｍｏｖｅを有する。ＡｄｄメソッドおよびＲｅｍｏｖｅメソッドは、エンティティがＥｎｔｉｔｙＳｅｔコレクションに追加されるかこれから除去されるときに、通知のデリゲートｏｎＡｄｄおよびｏｎＲｅｍｏｖｅが呼び出されることを保証する。ＥｎｔｉｔｙＲｅｆは、エンティティを返すｇｅｔアクセッサおよびエンティティの値をセットするｓｅｔアクセッサを有するＥｎｔｉｔｙプロパティを含む。しかし、ｓｅｔアクセッサは、ｏｎＡｄｄメソッドまたはｏｎＲｅｍｏｖｅメソッドを使用して通知を実行する。
【００４８】
図７は、データオブジェクトリレーションシップを維持しながらセットコンテナからデータオブジェクトを除去するプログラミング方法７００の流れ図である。具体的に言うと、ここでは、上のカスタマ注文の例に関して注文の追加または除去を述べる。符号７０２で、呼び出しを行って、データオブジェクトを更新する。例えば、呼び出し「Ｏｒｄｅｒ＝Ｃｕｓｔ１」によって、ＯｒｄｅｒであるＯｒｄ１を更新して、カスタマＣｕｓｔ１を追加することができる。７０４で、データオブジェクトの追加または除去のどちらを行うかを判定する。注文を除去する場合には、７０６でのデータオブジェクトのコレクションからデータオブジェクトを除去する通知、および７０８で値にヌルをセットする。その後、このプロセスは７１０で終了する。しかし、注文を追加する場合には、７１２で値をセットし、７１４でのデータオブジェクトのコレクションにデータオブジェクトを追加する通知。このプロセスは７１０で終了する。
【００４９】
セットコンテナおよび参照コンテナを使用することによって、１対１、１対多、および多対多のリレーションシップをモデリングすることができる。しかし、通知のループを防ぐために、コンテナの対の一方のメンバが、制御を保持し、リレーションシップを管理するプロトコルを確立しなければならない。ループは、コンテナの対の第１コンテナからの通知が、第２コンテナから第１コンテナに戻る通知をトリガする場合に発生するはずである。
【００５０】
参照コンテナのソースコードを最適化することができる。参照コンテナは、制限付きのセットコンテナと考えることができる。参照コンテナの機能性は、別々のクラス（例えば、ＥｎｔｉｔｙＲｅｆ）を宣言せずに達成することができる。次のＣ＃コードに示されているように、参照コンテナの機能性を、部分クラス（例えば、Ｏｒｄｅｒ）の宣言の内側に移動して、オーバーヘッドを減らすことができる。
【００５１】
【表９】
2009507269.tif 000011
【００５２】
ここでは、クラスＯｒｄｅｒのＣｕｓｔｏｍｅｒプロパティが、カスタマの注文のリストに注文を追加し、またはそのリストから注文を除去するｓｅｔアクセッサを含む。このｓｅｔアクセッサは、上で説明したＥｎｔｉｔｙＲｅｆクラスのＯｎＡｄｄメソッドおよびＯｎＲｅｍｏｖｅメソッドと機能的に同等である。
【００５３】
参照コンテナの最適化は、処理中のオーバーヘッドを減らすことができるが、簡潔さのより少ないソースコードをもたらす可能性がある。しかし、ソースコードの簡潔さまたは明瞭さは、ツールによって生成されるソースコードに関してクリティカルではない可能性がある。
【００５４】
ＩＩＩ．延期されたローディングまたは遅延ローディング
オブジェクト関係マッピングインフラストラクチャを、リレーショナルデータの延期されたローディングまたは遅延ローディングに関しても提供することができる。一般に、リレーショナルデータは、処理の始めにバッチでまたは必要を基礎としてのいずれかで、データストレージコンポーネントから取り出される。データ集中型プログラミングに関して、データのバッチ取り出しは、処理中にデータを格納するために大量のデータを必要とする場合がある。データが参照されるまでデータのローディングを延期することによって、必要なメモリの量が減る。しかし、データオブジェクトは、参照される前にメモリにロードされなければならない。
【００５５】
図８は、ＯＲＭシステムでの延期されたローディングのオンデマンドでの実行の方法８００を示す流れ図である。符号８０２で開始して、処理中に、呼び出しを行って、データオブジェクトにナビゲートする。８０４で、データオブジェクトへのナビゲーションをインターセプトする。８０６で、データオブジェクトが既に投入されており、リレーショナルデータを含むかどうか、またはデータオブジェクトがまだ投入されていないかどうかに関する判定を行う。データオブジェクトがリレーショナルデータを含む場合には、８１２で、データオブジェクトへのナビゲーションを継続する。そうでない場合には、８０８で、データオブジェクトに対応するリレーショナルデータをデータストレージコンポーネントから取り出す。取り出しには、データベースクエリまたはデータ取り出しの任意の他の方法を含めることができる。８１０で、取り出されたデータを使用して、データオブジェクトを投入する。８１２で、データオブジェクトへのナビゲーションを継続する。
【００５６】
参照コンテナおよびセットコンテナにローディングコンポーネントを含めて、リレーショナルデータの延期されたローディングを実現することができる。これらのコンテナは、データオブジェクト間のナビゲーションをインターセプトし、データストレージコンポーネントに照会し、オンザフライでデータオブジェクトを作成し、投入することができ、これによって、すべてのデータオブジェクトを使用の前にメモリにロードすることを実際に必要とせずに、データオブジェクトが完全に投入されているという錯覚を作り上げることができる。
【００５７】
次の例示的なＣ＃コードは、ＥｎｔｉｔｙＳｅｔクラスに追加メンバを与えて、遅延ローディングすなわち延期されたローディングを実現する。
【００５８】
【表１０】
2009507269.tif 000012
【００５９】
ここでは、ｇｅｔアクセッサが、ＴＥｎｔｉｔｙオブジェクトへのナビゲーションをインターセプトし、ＥｎｔｉｔｙＳｅｔクラスのＬｏａｄメソッドメンバを呼び出す。Ｌｏａｄメソッドは、ＴＥｎｔｉｔｙオブジェクトが既にメモリにロードされているかどうかを知るためにチェックし、そうでない場合には、エンティティのリストが、作成され、投入される。ｇｅｔアクセッサを使用してナビゲーションをインターセプトすることによって、ＥｎｔｉｔｙＳｅｔのターゲットが、参照される前にロードされることが保証される。同様に、ｓｅｔアクセッサは、ＴＥｎｔｉｔｙオブジェクトへのナビゲーションをインターセプトする。ｓｅｔアクセッサも、ロードメソッドを呼び出して、ＴＥｎｔｉｔｙオブジェクトの値をセットする前に、ＴＥｎｔｉｔｙオブジェクトが作成され、投入されることを保証する。
【００６０】
ＩＶ．強く型付けされたテーブル
通常、データオブジェクトは、データベースなどのデータストレージシステムまたはデータストレージコンポーネントのリレーショナルデータテーブル内に格納される。例えば、上で述べた在庫システムでは、データストレージコンポーネントに、カスタマのテーブルおよび注文のテーブルを含めることができる。新しいカスタマまたは注文がこの在庫システムに追加されるときに、行が、適当なテーブルに追加される。同様に、カスタマまたは、注文がこの在庫システムから削除されるときに、行が、適当なテーブルから削除される。
【００６１】
オブジェクト指向プログラミングコンストラクトを使用してデータストレージシステムからのリレーショナルデータをモデリングするときに、オブジェクトモデルまたはコンストラクトは、データストレージシステムのリレーショナルデータテーブルに対応する強く型付けされたデータオブジェクトテーブルのセットを含まなければならない。プログラミング言語コンストラクトデータオブジェクトテーブルは、アプリケーションで使用されるデータストレージシステムのリレーショナルデータテーブルの表現とすることができる。在庫システムの例では、生成されるソースコードは、ＣｕｓｔｏｍｅｒのテーブルおよびＯｒｄｅｒのテーブルを含まなければならない。
【００６２】
アプリケーションによるコンストラクトテーブルに対する変更のすべてを、追跡し、データストレージシステムテーブルに永続させなければならない。例えば、新しい対応するＣｕｓｔｏｍｅｒ行をテーブルに挿入することによって、対応するデータストレージシステムテーブルを更新できるようにするために、Ｃｕｓｔｏｍｅｒなどのクラスの新たに作成されるインスタンスのそれぞれを追跡しなければならない。同様に、行の削除に関して、Ｃｕｓｔｏｍｅｒまたは他のクラスインスタンスの削除を追跡し、対応するデータストレージシステムテーブルに永続させなければならない。
【００６３】
データオブジェクトテーブルは、ジェネリッククラス（例えば、Ｔａｂｌｅ）を使用して作成することができる。ジェネリッククラスは、データオブジェクトテーブルに格納された異なるタイプのオブジェクト（例えば、カスタマ、注文、供給業者、荷主．．．）を扱うために特殊化することができる。ジェネリッククラスを使用してデータオブジェクトテーブルを実装することによって、テーブルの共通の特徴が活用される。例えば、各テーブルは、データオブジェクトを追加し、除去するメソッドを必要とする可能性がある。Ｔａｂｌｅの次の例示的な宣言を検討されたい。
【００６４】
【表１１】
2009507269.tif 000013
【００６５】
ジェネリッククラスＴａｂｌｅでメンバＡｄｄおよびＲｅｍｏｖｅを定義することによって、個々のデータオブジェクトテーブルごとにＡｄｄメンバおよびＲｅｍｏｖｅメンバを作成する必要がなくなる。
【００６６】
図９に、データストレージシステムテーブルに対応するデータオブジェクトテーブルのセットを作成する方法９００を示す。符号９０２で開始して、データストレージシステム内のテーブルの個数および各テーブルのタイプを判定する。９０４で、データストレージシステムテーブルに対応するデータオブジェクトテーブルを、ジェネリッククラスを使用してインスタンス化する。９０６で、チェックを行って、モデリングすべき追加のデータストレージシステムテーブルがあるかどうかを判定する。そうである場合には、９０４で次のデータオブジェクトテーブルをインスタンス化する。すべてのデータストレージシステムテーブルをモデリングし終えている場合には、この方法は、９０８で終了する。
【００６７】
例の在庫システムに関して、データコンテキスは、データストレージシステムテーブルをミラーリングするデータオブジェクトテーブルのセットを使用して作成することができる。次のＣ＃コードを検討されたい。
【００６８】
【表１２】
2009507269.tif 000014
【００６９】
ここでは、ジェネリッククラスＴａｂｌｅが、Ｃｕｓｔｏｍｅｒｓ、Ｓｈｉｐｐｅｒｓ、Ｓｕｐｐｌｉｅｒｓ、Ｏｒｄｅｒｓ、およびＰｒｏｄｕｃｔｓのコレクションを作成するのに使用されている。本明細書で使用されるときに、Ｔａｂｌｅ＜Ｔ＞は、対応するデータストレージシステムテーブルの仮想表現である。生成されるコードは、個々のデータオブジェクトテーブルのＡｄｄメソッドおよびＲｅｍｏｖｅメソッドに関する強い型検査を提供する。データオブジェクトテーブルの生成は、ソフトウェア開発者がデータストレージシステムのテーブルごとに別々のテーブルを定義する必要をもなくし、開発者の作業時間およびデバッグ時間を減らす。
【００７０】
新たに作成されるインスタンスおよび削除される取り出されるインスタンスだけが、強く型付けされるテーブルを使用して追跡される。新しいインスタンスおよび削除されるインスタンスが適当に追跡されることを保証するために、生成されるコードを呼び出す例示的な方法を示す。
【００７１】
【表１３】
2009507269.tif 000015
【００７２】
Ｖ．リレーショナルデータ変更の検出および追跡
コード生成システムは、データストレージシステムからオブジェクトモデルにプルされたリレーショナルデータに対する変更の検出および追跡をも提供することができる。リレーショナルデータが、データストレージシステムからプルされて、アプリケーションによって使用されるデータオブジェクトに投入されるときに、そのデータオブジェクトが、ＯＲＭシステムに知られずに修正される場合がある。しかし、挿入、修正、または削除のすべてを、データストレージシステムに戻って永続させなければならない。さらに、第１アプリケーションの処理中に、他のアプリケーションが、データストレージシステムにアクセスし、第１アプリケーションによって使用されるデータオブジェクトを投入するのに使用されたリレーショナルデータを修正する場合がある。リレーショナルデータが、第１アプリケーションからデータストレージシステムに永続されるときに、これが、他のアプリケーションによって行われた変更を上書きしてはならない。
【００７３】
１つの単純な解決策は、すべてのデータオブジェクトのコピーすなわち、データストレージシステムから取り出されたオリジナルデータを含むコピーを維持することである。これらのコピーを、データオブジェクトの現在の値と比較して、データオブジェクトが修正されたかどうかを判定することができる。これは、未変更のままであるデータオブジェクトに関して同一のコピーを格納するのにメモリが使用されることをもたらす。さらに、修正がデータストレージシステムに永続されるときに、各データオブジェクトは、そのデータオブジェクトに対する変更があったかどうかを判定するために、オリジナルの値を含むコピーと比較される。未変更のままであるデータオブジェクトを比較することによって、処理時間が浪費される。
【００７４】
開示される主題の一態様では、コードジェネレータコンポーネントは、開発者によって可視であり修正可能であるソースレベルコードを生成して、変更の検出および追跡を実装することができる。変更の検出および追跡は、中間フォーマット（例えば、バイトコードまたはＩＬ（中間言語））に隠蔽されるのではなく、ソースレベルコードで実装することができる。実装をソースレベルコードに配置することによって、その実装がソフトウェア開発者にトランスペアレントになる。
【００７５】
生成されるコードは、アプリケーションによって修正されるデータオブジェクトだけについてコピーを作成することができる。これは、各データオブジェクトのコピーを作成する必要をなくし、コピーの個数を制限することによってスペースオーバーヘッドを最小にする。さらに、これは、データオブジェクトが変更されたかどうかを判定するために、未変更のデータオブジェクトをそのコピーと比較するのに必要な処理時間をなくす。
【００７６】
ここで図１０に移ると、コンテナソースコードに、データオブジェクトが修正されようとしているときにＯＲＭシステム内の変更検出コンポーネントに通知する変更通知コンポーネントを含めることができる。変更通知コンポーネントは、イベントハンドラを利用することができる。図１０に、修正されたオブジェクトを追跡する方法１０００を示す。符号１００２で開始して、アプリケーションが、データオブジェクトを更新する呼び出しを行う。１００４で、データオブジェクトを更新する呼び出しによって、通知がトリガされる。１００６で、変更検出コンポーネントが、データオブジェクトが以前にコピーされたかどうかを検査する。データオブジェクトが前にコピーされていない場合には、変更検出コンポーネントは、１００８で、そのデータオブジェクトをコピーし、データオブジェクトのコピーを、修正されたデータオブジェクトのリストに追加する。データオブジェクトが既にコピーされている場合には、オリジナルデータオブジェクトのコピーが、既にリストに追加されており、これを上書きしてはならない。１０１０で、アプリケーションによる指定に従って、データオブジェクトを更新する。次の例示的なＣ＃コードを検討されたい。
【００７７】
【表１４】
2009507269.tif 000016
【００７８】
通知インターフェースを使用して、変化するオブジェクトに関するイベントハンドラを指定することができる。
【００７９】
【表１５】
2009507269.tif 000017
【００８０】
ここでは、上で詳細に説明したＣｕｓｔｏｍｅｒクラス内のプロパティに関するｓｅｔアクセッサが、データオブジェクトが変更されようとしていることをＯＲＭシステムの変更検出コンポーネントに知らせる通知を含む。ＯＲＭシステムは、データオブジェクトが修正される前にＯＲＭシステムがコピーを作成することを可能にするために、データオブジェクトが実際に変更される直前に通知される。
【００８１】
ここで図１１に移ると、ある点で、データオブジェクトに対する修正を、データストレージシステムに戻って永続させなければならない。図１１に、変更をデータストレージシステムに永続させる方法１１００を示す。１１０２で開始して、第１データオブジェクトコピーを、修正されたデータオブジェクトのリストから取り出す。データオブジェクトコピーは、データストレージシステムからプルされたオリジナルのリレーショナルデータを含む。１１０４で、データオブジェクトコピーを、データストレージシステム内のデータオブジェクトと比較する。１１０６で、チェックを行って、データオブジェクトコピーがデータストレージシステムオブジェクトと異なるかどうかを判定する。そうである場合には、データストレージシステム内のデータオブジェクトが、修正されており、１１０８で例外を生成することができる。データオブジェクトコピーおよびデータストレージシステムオブジェクトが同一である場合には、データストレージシステムオブジェクトは変更されておらず、１１１０で、修正されたデータオブジェクトを、データストレージシステムに永続させることができる。１１１２でチェックを行って、修正されたデータオブジェクトのリストに追加のデータオブジェクトがあるかどうかを判定する。そうである場合には、１１０２で、次のデータオブジェクトコピーを取り出す。そうでない場合には、この方法は、１１１４で終了する。
【００８２】
前述のシステムは、複数のコンポーネントの間の相互作用に関して説明された。そのようなシステムおよびコンポーネントに、上で指定されたコンポーネントまたはサブコンポーネント、指定されたコンポーネントまたはサブコンポーネントのうちのいくつか、および／または追加のコンポーネントを含めることができることを了解されたい。サブコンポーネントを、親コンポーネント内に含まれるのではなく、他のコンポーネントに通信的に結合されたコンポーネントとして実施することもできる。さらに、１つまたは複数のコンポーネントを、集約機能性を提供する単一のコンポーネントに組み合わせ、あるいは複数のサブコンポーネントに分割することができることに留意されたい。これらのコンポーネントは、本明細書で具体的には説明されないが当業者に既知の１つまたは複数の他のコンポーネントと相互作用することもできる。
【００８３】
さらに、了解されるとおり、上の開示されたシステムおよび下の方法の様々な部分は、人工知能ベース、知識ベース、またはルールベースのコンポーネント、サブコンポーネント、プロセス、手段、方法、または機構（例えば、サポートベクトルマシン、ニューラルネットワーク、エキスパートシステム、Ｂａｙｅｓｉａｎ  ｂｅｌｉｅｆ  ｎｅｔｗｏｒｋ、ファジイ論理、ｄａｔａ  ｆｕｓｉｏｎ  ｅｎｇｉｎｅ、クラシファイヤ．．．）を含むかこれらからなるものとすることができる。そのようなコンポーネントは、なかんずく、それによって実行されるある種の機構またはプロセスを自動化して、このシステムおよび方法の諸部分をより適応式であると同時に効率的かつインテリジェントにすることができる。
【００８４】
上で説明した例示的システムに鑑みて、開示される主題に従って実施できる方法は、図２、５〜１１の流れ図を参照してよりよく理解される。説明を単純にするために、これらの方法は、一連のブロックとして図示され、説明されるが、一部のブロックが、異なる順序でおよび／または図示され本明細書で説明される他のブロックと同時に発生し得るので、請求される主題が、ブロックの順序によって限定されないことを理解し、了解されたい。さらに、図示されたブロックの一部が、下で説明する方法の実施に必要でない場合がある。
【００８５】
さらに、下および本明細書全体を通じて開示される方法が、そのような方法をコンピュータにトランスポートし、転送するのを容易にするために製造品に格納されることができることをさらに了解されたい。本明細書で使用される用語製造品は、任意のコンピュータ可読デバイス、搬送波、または媒体からアクセス可能なコンピュータプログラムを含むことが意図されている。
【００８６】
開示される主題の様々な態様のコンテキストを提供するために、図１２および１３ならびに次の議論は、開示される主題の様々な態様を実施できる適切な環境の短い全般的な説明を提供することを意図されたものである。この主題を、１つのコンピュータおよび／または複数のコンピュータで動作するコンピュータプログラムのコンピュータ実行可能命令の全般的な文脈を上で説明したが、当業者は、本発明を他のプログラムモジュールと組み合わせて実施することもできることを認めるであろう。一般に、プログラムモジュールは、特定のタスクを実行し、かつ／または特定の抽象データ型を実装するルーチン、プログラム、コンポーネント、データ構造などを含む。さらに、当業者は、本発明の方法を、シングルプロセッサコンピュータシステムまたはマルチプロセッサコンピュータシステム、ミニコンピューティングデバイス、メインフレームコンピュータ、ならびにパーソナルコンピュータ、ハンドヘルドコンピューティングデバイス（例えば、携帯情報端末（ＰＤＡ）、電話機、腕時計．．．）、マイクロプロセッサベースのまたはプログラマブルなコンシューマエレクトロニクスまたは産業用エレクトロニクス、および類似物を含む、他のコンピュータシステム構成を用いて実践できることを諒解するであろう。示された態様は、通信ネットワークを介してリンクされたリモート処理デバイスによってタスクが実行される分散コンピューティング環境でも実践することができる。しかし、本発明の態様の、すべてではないにせよ一部を、独立型コンピュータで実践することができる。分散コンピューティング環境では、プログラムモジュールを、ローカルとリモートとの両方のメモリストレージデバイスに置くことができる。
【００８７】
図１２を参照すると、本明細書で開示される様々な態様を実施する例示的環境１２１０に、コンピュータ１２１２（例えば、デスクトップ機、ラップトップ機、サーバ、ハンドヘルド機、プログラマブルなコンシューマエレクトロニクスまたは産業用エレクトロニクス．．．）が含まれる。コンピュータ１２１２は、処理ユニット１２１４、システムメモリ１２１６、およびシステムバス１２１８を含む。システムバス１２１８は、システムメモリ１２１６を含むがこれに限定されないシステムコンポーネントを処理ユニット１２１４に結合する。処理ユニット１２１４は、様々な使用可能なマイクロプロセッサのいずれかとすることができる。デュアルマイクロプロセッサおよび他のマルチプロセッサアーキテクチャも、処理ユニット１２１４として使用することができる。
【００８８】
システムバス１２１８は、メモリバスもしくはメモリコントローラ、周辺バスもしくは外部バス、ならびに／または１１ビットバス、Ｉｎｄｕｓｔｒｉａｌ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＩＳＡ）、マイクロチャネルアーキテクチャ（ＭＣＡ）、Ｅｘｔｅｎｄｅｄ  ＩＳＡ（ＥＩＳＡ）、Ｉｎｔｅｌｌｉｇｅｎｔ  Ｄｒｉｖｅ  Ｅｌｅｃｔｒｏｎｉｃｓ（ＩＤＥ）、ＶＥＳＡ  Ｌｏｃａｌ  Ｂｕｓ（ＶＬＢ）、Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ（ＰＣＩ）、Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ（ＵＳＢ）、Ａｄｖａｎｃｅｄ  Ｇｒａｐｈｉｃｓ  Ｐｏｒｔ（ＡＧＰ）、Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ  Ｍｅｍｏｒｙ  Ｃａｒｄ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ａｓｓｏｃｉａｔｉｏｎバス（ＰＣＭＣＩＡ）、およびＳｍａｌｌ  Ｃｏｍｐｕｔｅｒ  Ｓｙｓｔｅｍｓ  Ｉｎｔｅｒｆａｃｅ（ＳＣＳＩ）を含むがこれに限定されない様々な使用可能なバスアーキテクチャのいずれかを使用するローカルバスを含む複数のタイプのバス構造のいずれかとすることができる。
【００８９】
システムメモリ１２１６は、揮発性メモリ１２２０および不揮発性メモリ１２２２を含む。スタートアップ中などにコンピュータ１２１２内の要素の間で情報を転送する基本ルーチンを含む基本入出力システム（ＢＩＯＳ）が、不揮発性メモリ１２２２に格納される。限定ではなく例として、不揮発性メモリ１２２２は、読取専用メモリ（ＲＯＭ）、プログラマブルＲＯＭ（ＰＲＯＭ）、電気的プログラム可能ＲＯＭ（ＥＰＲＯＭ）、電気的消去可能ＲＯＭ（ＥＥＰＲＯＭ）、またはフラッシュメモリを含むことができる。揮発性メモリ１２２０は、外部キャッシュメモリとして働くランダムアクセスメモリ（ＲＡＭ）を含む。限定ではなく例として、ＲＡＭは、シンクロナスＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、シンクロナスＤＲＡＭ（ＳＤＲＡＭ）、ダブルデータレートＳＤＲＡＭ（ＤＤＲ  ＳＤＲＡＭ）、エンハンストＳＤＲＡＭ（ＥＳＤＲＡＭ）、Ｓｙｎｃｈｌｉｎｋ  ＤＲＡＭ（ＳＬＤＲＡＭ）、およびｄｉｒｅｃｔ  Ｒａｍｂｕｓ  ＲＡＭ（ＤＲＲＡＭ）などの多数の形で入手可能である。
【００９０】
コンピュータ１２１２は、リムーバブル／ノンリムーバブルの揮発性／不揮発性コンピュータ記憶媒体をも含む。図１２に、例えば、ディスクストレージ１２２４を示す。ディスクストレージ１２２４は、磁気ディスクドライブ、フロッピー（登録商標）ディスクドライブ、テープドライブ、Ｊａｚドライブ、Ｚｉｐドライブ、ＬＳ−１００ドライブ、フラッシュメモリカード、またはメモリスティックなどのデバイスを含むが、これらに限定はされない。さらに、ディスクストレージ１２２４に、コンパクトディスクＲＯＭデバイス（ＣＤ−ＲＯＭ）、ＣＤ  ｒｅｃｏｒｄａｂｌｅドライブ（ＣＤ−Ｒドライブ）、ＣＤ  ｒｅｗｒｉｔａｂｌｅドライブ（ＣＤ−ＲＷドライブ）、またはデジタル多用途ディスクＲＯＭドライブ（ＤＶＤ−ＲＯＭ）などの光学ディスクドライブを含むがこれに限定されない記憶媒体を、他の記憶媒体と別々にまたはこれらと組み合わせて含めることができる。システムバス１２１８へのディスクストレージデバイス１２２４の接続を容易にするために、インターフェース１２２６などのリムーバブルまたはノンリムーバブルのインターフェースが、通常は使用される。
【００９１】
図１２に、ユーザと、適切なオペレーティング環境１２１０で説明した基本的なコンピュータリソースとの間の媒介として働くソフトウェアが記載されていることを諒解されたい。そのようなソフトウェアに、オペレーティングシステム１２２８が含まれる。オペレーティングシステム１２２８は、ディスクストレージ１２２４に格納することができるが、コンピュータシステム１２１２のリソースを制御し、割り当てるように働く。システムアプリケーション１２３０は、システムメモリ１２１６内またはディスクストレージ１２２４上のいずれかに格納されたプログラムモジュール１２３２およびプログラムデータ１２３４を介するオペレーティングシステム１２２８によるリソースの管理を利用する。本発明を、様々なオペレーティングシステムまたはオペレーティングシステムの組合せを用いて実施できることを諒解されたい。
【００９２】
ユーザは、入力デバイス１２３６を介してコンピュータ１２１２にコマンドまたは情報を入力する。入力デバイス１２３６は、マウスなどのポインティングデバイス、トラックボール、スタイラス、タッチパッド、キーボード、マイクロホン、ジョイスティック、ゲームパッド、衛星パラボラアンテナ、スキャナ、ＴＶチューナカード、デジタルカメラ、デジタルビデオカメラ、ウェブカメラ、および類似物を含むが、これらに限定はされない。これらおよび他の入力デバイスは、インターフェースポート１２３８を介し、システムバス１２１８を介して処理ユニット１２１４に接続される。インターフェースポート１２３８は、例えば、シリアルポート、パラレルポート、ゲームポート、およびｕｎｉｖｅｒｓａｌ  ｓｅｒｉａｌ  ｂｕｓ（ＵＳＢ）を含む。出力デバイス１２４０は、入力デバイス１２３６と同一タイプのポートのいくつかを使用する。したがって、例えば、ＵＳＢポートを使用して、コンピュータ１２１２に入力を提供し、コンピュータ１２１２から出力デバイス１２４０に情報を出力することができる。出力アダプタ１２４２が、ディスプレイ（例えば、フラットパネルおよびＣＲＴ）、スピーカ、およびプリンタなど、出力デバイス１２４０の中でも特殊なアダプタを必要とするいくつかの出力デバイス１２４０があることを示すために提供される。出力アダプタ１２４２には、限定ではなく例として、出力デバイス１２４０とシステムバス１２１８との間の接続の手段を提供する、ビデオカードおよびサウンドカードが含まれる。リモートコンピュータ１２４４など、他のデバイスおよび／またはデバイスのシステムが、入力機能と出力機能との両方を提供することに留意されたい。
【００９３】
コンピュータ１２１２は、リモートコンピュータ１２４４などの１つまたは複数のリモートコンピュータへの論理接続を使用して、ネットワーク化された環境で動作することができる。リモートコンピュータ１２４４は、パーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ワークステーション、マイクロプロセッサベースの機器、ピアデバイス、または他の一般的なネットワークノードおよび類似物とすることができ、通常は、コンピュータ１２１２に関して説明した要素の多数またはすべてを含む。図を簡単にするために、メモリストレージデバイス１２４６だけが、リモートコンピュータ１２４４と共に図示されている。リモートコンピュータ１２４４は、論理的にネットワークインターフェース１２４８を介してコンピュータ１２１２に接続され、次に、物理的に通信接続１２５０を介して接続される。ネットワークインターフェース１２４８は、ローカルエリアネットワーク（ＬＡＮ）および広域ネットワーク（ＷＡＮ）などの通信ネットワークを含む。ＬＡＮテクノロジは、Ｆｉｂｅｒ  Ｄｉｓｔｒｉｂｕｔｅｄ  Ｄａｔａ  Ｉｎｔｅｒｆａｃｅ（ＦＤＤＩ）、Ｃｏｐｐｅｒ  Ｄｉｓｔｒｉｂｕｔｅｄ  Ｄａｔａ  Ｉｎｔｅｒｆａｃｅ（ＣＤＤＩ）、イーサネット（登録商標）／ＩＥＥＥ８０２．３、トークンリング／ＩＥＥＥ  ８０２．５、および類似物を含む。ＷＡＮテクノロジは、ポイントツーポイントリンク、サービス総合デジタル網（ＩＳＤＮ）およびその変形形態などの回路交換網、パケット交換網、およびデジタル加入者回線（ＤＳＬ）を含むが、これに限定はされない。
【００９４】
通信接続１２５０は、ネットワークインターフェース１２４８をバス１２１８に接続するのに使用されるハードウェア／ソフトウェアを指す。通信接続１２５０は、図を明瞭にするためにコンピュータ１２１２の内部に図示されているが、コンピュータ１２１２の外部とすることもできる。ネットワークインターフェース１２４８への接続に必要なハードウェア／ソフトウェアは、例示のみとして、通常の電話等級モデム、ケーブルモデム、電力線モデム、およびＤＳＬモデムを含むモデム、ＩＳＤＮアダプタ、ならびにイーサネット（登録商標）カードまたはイーサネット（登録商標）コンポーネントなどの、内蔵テクノロジおよび外付けテクノロジを含む。
【００９５】
図１３は、本発明が相互作用できるサンプルのコンピューティング環境１３００の概略ブロック図である。システム１３００は、１つまたは複数のクライアント１３１０を含む。クライアント１３１０は、ハードウェアおよび／またはソフトウェア（例えば、スレッド、プロセス、コンピューティングデバイス）とすることができる。システム１３００は、１つまたは複数のサーバ１３３０をも含む。したがって、システム１３００は、他のモデルの中でも、２ティアクライアントサーバモデルまたはマルチティアモデル（例えば、クライアント、ミドルティアサーバ、データサーバ）に対応することができる。サーバ１３３０も、ハードウェアおよび／またはソフトウェア（例えば、スレッド、プロセス、コンピューティングデバイス）とすることができる。クライアント１３１０とサーバ１３３０との間の可能な通信の１つを、複数のコンピュータプロセスの間で伝送されるように適合されたデータパケットの形とすることができる。システム１３００は、クライアント１３１０とサーバ１３３０との間の通信を容易にするのに使用することができる通信フレームワーク１３５０を含む。クライアント１３１０は、クライアント１３１０にローカルな情報を格納するのに使用できる１つまたは複数のクライアントデータストア１３６０に動作可能に接続される。同様に、サーバ１３３０は、サーバ１３３０にローカルな情報を格納するのに使用することができる１つまたは複数のサーバデータストア１３４０に動作可能に接続される。
【００９６】
上で説明したものは、請求される主題の諸態様の例を含む。もちろん、請求される主題の説明においてコンポーネントまたは方法のすべての考えられる組合せを説明することは不可能であるが、当業者は、開示された主題の多数のさらなる組合せおよび置換が可能であることを認めるであろう。したがって、開示された主題は、添付の特許請求の範囲の趣旨および範囲に含まれるすべてのそのような代替形態、修正形態、および変形形態を含むことが意図されている。さらに、用語「ｉｎｃｌｕｄｅｓ」、「ｈａｓ」、または「ｈａｖｉｎｇ」が詳細な説明または特許請求の範囲のいずれかで使用される範囲で、これらの用語は、用語「ｃｏｍｐｒｉｓｉｎｇ」が特許請求の範囲で前後を接続する単語として使用されるときに「ｃｏｍｐｒｉｓｉｎｇ」が解釈される形に類似する形で包含的であることを意図されている。
【図面の簡単な説明】
【００９７】
【図１】ツールによって生成されるソースコードのコンパイルシステムを示すブロック図である。
【図２】デフォルトクラスメンバを処理する方法を示す流れ図である。
【図３】ＯＲＭシステムを示すブロック図である。
【図４】カスタマ注文リレーションシップを示すブロック図である。
【図５】データオブジェクトリレーションシップを維持しながらデータオブジェクトをコンテナに追加する方法を示す流れ図である。
【図６】データオブジェクトリレーションシップを維持しながらデータオブジェクトをコンテナから除去する方法を示す流れ図である。
【図７】データオブジェクトリレーションシップを維持しながらデータオブジェクト参照を追加しまたは除去する方法を示す流れ図である。
【図８】ＯＲＭシステムに関する延期されたローディングを実行する方法を示す流れ図である。
【図９】データストレージシステムテーブルに対応するデータオブジェクトテーブルのセットを作成する方法を示す流れ図である。
【図１０】修正されたオブジェクトを追跡する方法を示す流れ図である。
【図１１】リレーショナルデータに対する修正をデータストレージシステムに永続させる方法を示す流れ図である。
【図１２】適切なオペレーティング環境を示す概略ブロック図である。
【図１３】サンプルのコンピューティング環境を示す概略ブロック図である。
【図１】
2009507269.tif 000018
【図２】
2009507269.tif 000019
【図３】
2009507269.tif 000020
【図４】
2009507269.tif 000021
【図５】
2009507269.tif 000022
【図６】
2009507269.tif 000023
【図７】
2009507269.tif 000024
【図８】
2009507269.tif 000025
【図９】
2009507269.tif 000026
【図１０】
2009507269.tif 000027
【図１１】
2009507269.tif 000028
【図１２】
2009507269.tif 000029
【図１３】
2009507269.tif 000030