2011-01-16 4 views
1

私はnhibernateに関するいくつかの質問があります。nhibernateに関する質問

  1. 文脈上のセッションの意味はまだ分かりません。私はウェブのものをやるので、私はただ "ウェブ"を選ぶだけですが、実際に何をしているのか分かりません。

  2. Application_BeginRequestにsession.BeginTransaction()を設定する必要がありますか?

  3. Application_EndRequestですべてをコミットする必要がありますか?または、必要なときにコミットする必要があります。私はユーザーを挿入し、その後いくつかのコードで私はいくつかの他のテーブルを更新する必要がありますダウンする必要があります。私はユーザーを作って、アップデートをして、最終的にコミットするか、両方をコミットする準備が整うまで待ちますか?

  4. Application_EndRequestには常にsession.Rollback()を設定する必要がありますか?

  5. Application_EndRequestにsession.close()またはsession.dispose()またはその両方を設定する必要がありますか?

答えて

1
  1. 「ウェブ」は、文脈が唯一HttpContextあたりSessionFactoryごとに単一の「現在」Session(すなわち、要求ごと)が存在することを意味します。それをバインド/アンバインドするのはあなたの責任です。

  2. 1つのリクエスト== 1トランザクションと同じにしたいのであれば、それほど深刻なことはありません。

  3. セッションは作業単位であることを忘れないでください。あなたは単一の要求で複数のトランザクションを持っている可能性がありますが、それは非常に一般的ではありませんので、私は(あなたの第二の質問と一致し、それを維持する)エラーが発生した場合を除き、あなたはEndRequestのにコミットする必要があると言うだろう

  4. 必ずしもそうではありません。エラーがあればそれを呼び出すことができますが、処理すると同じ効果があります。

  5. ディスポーザブルで十分です。

0

コンテキストセッションの詳細については、linkをご覧ください。

あなたの他の質問は、すべて一種の関連です。 Hibernateトランザクションはアトミックでなければなりませんが、トランザクションとそのセッションの範囲は作業単位に限定する必要があります。言い換えると、何かを永続化したり取得したりする必要があるときにセッションを開き、完了したらセッションを閉じる必要があります。

一般的に、シングルトンセッションを提供するいくつかの種類のセッションマネージャと一緒に、HibernateのDAOデザインパターンを使用することをお勧めします。

私は、Hibernateセッションとトランザクションでthis articleを読むことを強くお勧めします。ここで私が先ほど話したことについてもっと深く説明し、DAOパターンを実装する方法について説明します。