はISession
随時、ADO.NET接続の状態をメモリに保持されているオブジェクトの状態と同期するために必要なSQLステートメントを実行します。このプロセス、フラッシュは、デフォルトで次の時点で発生します
Find()
またはのいくつかの呼び出しからEnumerable()
- から
NHibernate.ITransaction.Commit()
- から
ISession.Flush()
SQLステートメントは次の順序で発行されます
- すべてのエンティティの挿入。対応するオブジェクトが保存されたのと同じ順序で
ISession.Save()
- すべてのエンティティの更新
- すべてのコレクションの削除
- すべてのコレクション要素の削除、更新、および挿入
- すべてのコレクション挿入
- すべてのエンティティの削除。対応するオブジェクトが削除されたのと同じ順序で
ISession.Delete()
(例外として、ネイティブID生成を使用するオブジェクトは、保存時に挿入されます。)
明示的に指定する場合を除いてFlush()
、セッションがADO.NET呼び出しをいつ実行するかについての保証はまったくなく、実行順序のみが保証されます。ただし、NHibernateは、ISession.Find(..)
メソッドが古いデータを返さないことを保証します。また、間違ったデータを返しません。
デフォルトの動作を変更して、フラッシュの発生頻度を下げることができます。FlushMode
唯一のコミット時にフラッシュ(とNHibernateはのときにのみ:クラスには、3つの異なるモードを定義しITransaction
、APIが使用されている)をフラッシュが自動的にルーチン、またはしない限り、決してフラッシュ説明使用してFlush()
明示的に呼び出されます。最後のモードは、ISession
が開いたままで、長時間切断されている、長時間実行される作業単位に役立ちます。
...
セッションの終了には、4つの異なるフェーズが含まれます。
- セッションをフラッシュする
- トランザクションをコミットする
- セッションを閉じる
- 例外を処理する
セッションのフラッシュ
たまたまITransaction
API を使用している場合は、この手順について心配する必要はありません。トランザクションがコミットされると、暗黙的に実行されます。それ以外の場合はISession.Flush()
、すべての変更がデータベースと同期されていることを確認するために呼び出す必要があります。
データベーストランザクションのコミット
NHibernate ITransaction APIを使用している場合、これは次のようになります。
tx.Commit(); // flush the session and commit the transaction
ADO.NETトランザクションを自分で管理している場合は、手動Commit()
でADO.NETトランザクションを実行する必要があります。
sess.Flush();
currentTransaction.Commit();
変更をコミットしないことにした場合:
tx.Rollback(); // rollback the transaction
または:
currentTransaction.Rollback();
トランザクションをロールバックする場合は、現在のセッションをすぐに閉じて破棄し、NHibernateの内部状態が一貫していることを確認する必要があります。
ISessionを閉じる
ISession.Close()
セッションの終了をマークする呼び出し。Close()の主な影響は、ADO.NET接続がセッションによって解放されることです。
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
独自の接続を提供Close()
した場合、それへの参照を返すため、手動で閉じるか、プールに戻すことができます。それ以外の場合Close()
は、プールに戻します。