Nhibernate-load-get
NHibernate-ロード/取得
この章では、LoadおよびGet機能がどのように機能し、どのように使用できるかについて説明します。 これらは、主キーによってオブジェクトをロードするために ISession によって提供される2つの非常に類似したAPIです。
- Get -オブジェクトまたはnullを返します。
- Load -オブジェクトを返すか、 ObjectNotFoundException をスローします。
さて、なぜこれら2つの異なるAPIがあるのでしょうか?
Load
- これは、Loadがデータベースのラウンドトリップをより効率的に最適化できるためです。
- Loadは実際にプロキシオブジェクトを返すため、Load呼び出しを発行するときにデータベースにアクセスする必要はありません。
- そのプロキシにアクセスすると、オブジェクトはデータベースに存在しないため、その時点でObjectNotFoundExceptionをスローする可能性があります。
Get
- 逆に、CLRまたは Common Language Runtime の制限のためにGetを使用し、NHibernateはすぐにデータベースにアクセスする必要があり、オブジェクトが存在するかどうかを確認し、存在しない場合はnullを返します。
- プロキシオブジェクトを返すことができず、ユーザーが実際にアクセスしたときにそのプロキシオブジェクトをnullに交換したため、そのフェッチ、データベースへの往復を遅らせるオブジェクトオプションはありません。
これらが実際にどのように使用されるか、そしてGetとLoadの違いを見る簡単な例を見てみましょう。 同じドメインクラス Customers と Orders 、および同様に前の章の同じマッピングファイルを使用します。
この例では、最初に次のプログラムに示すようにGetを使用します。
ご覧のとおり、2つの Guid IDがあります。最初のIDは適切なIDです。データベースにあることがわかっているのは顧客のIDです。 一方、2番目のIDはデータベースに存在しません。 これらのIDは両方ともパラメーターとして* Get()*メソッドに渡され、結果がコンソールに出力されます。
上記のコードをコンパイルして実行すると、次の出力が表示されます。
ご覧のとおり、Customer1データは印刷されていますが、Customer2データは空です。これは、Customer2レコードがデータベースで使用できないためです。
アプリケーションを再度実行するとき、コミットステートメントの前にブレークポイントを挿入し、[ウォッチ]ウィンドウで両方の顧客を見てみましょう。
ご覧のとおり、Customer1のデータは利用可能ですが、Customer2はnullで、両方のタイプは NHibernateDemo.Customer です。
次のコードに示すのと同じ例で、Getの代わりにLoadメソッドを使用してみましょう。
この例を実行してみましょう。スクリーンショットに示されているように、次の例外がスローされます。
[ウォッチ]ウィンドウを見ると、タイプが両方のオブジェクトのカスタマープロキシであることがわかります。 また、コンソールウィンドウにCustomer1の同じデータが表示されます。