セッションは単なるトランザクションではなく、UnitOfWorkパターンの実装です。言い換えれば、ロードされたオブジェクトを保持し、永続化する必要があるオブジェクトを認識します。
作業単位は、ビジネス トランザクション中にデータベースに影響を与える可能性のあるすべての操作を追跡します。完了すると、作業の結果としてデータベースを変更するために実行する必要があるすべてのことを把握します。
セッションとトランザクションの関係をよりよく理解するには、この記事をご覧ください。
単一の Hibernate セッションは、単一のデータベース トランザクションと同じスコープを持つ場合があります。
これは、リクエストごとのセッションの実装パターンに使用される最も一般的なプログラミング モデルです。単一のセッションと単一のデータベース トランザクションは、特定の要求イベント (Web アプリケーションの Http 要求など) の処理を実装します。session-per-operation アンチパターンは絶対に使用しないでください。(操作ごとのセッションが適切な場合は非常にまれな例外があります。Hibernate を学んでいるだけであれば、これらに遭遇することはありません。)
別のプログラミング モデルは、長い会話のモデルです。たとえば、複数の要求/応答サイクルでユーザーとやり取りするために、ウィザード ダイアログなどのマルチステップ ダイアログを実装するアプリケーションです。これを実装する 1 つの方法は、session-per-request-with-detached-objects パターンです。永続オブジェクトは、ユーザーの思考時間中に切り離されたと見なされ、変更後に新しいセッションに再接続する必要があります。
ただし、会話ごとのセッション パターンをお勧めします。この場合、単一のセッションのスコープは単一のデータベース トランザクションよりも大きく、複数のデータベース トランザクションにまたがることがあります。各要求イベントは単一のデータベース トランザクションで処理されますが、会話をアトミックにするために、セッションのフラッシュは会話の最後と最後のデータベース トランザクションまで遅延されます。ユーザーの思考時間中、セッションは切断された状態で保持され、データベース接続は開かれません。Hibernate の自動楽観的同時実行制御 (バージョン管理を使用) を使用して、会話の分離を提供します。