17

私は2つの間で少し混乱しています。私が知っているように、両方が休止状態のセッションをSessionFactory.getCurrentSession()返し、hibernate.cfg.xml に設定されているプロパティに基づいてコンテキスト セッションを返します<property name="current_session_context_class">。常にこのアプローチを使用すべきではないでしょうか?

によって追加される付加価値は何SessionFactory.openSession()ですか?

4

1 に答える 1

37

sf.getCurrentSession()初めて呼び出されるたびにセッションが開かれます。これにより、セッションが存在しない場合はまったく新しいセッションが作成され、既存のセッションがすでに存在する場合は既存のセッションが使用されます。

ThreadLocalTomcatでは、これにより、基になるオブジェクトを使用して作成されたスレッドにセッションが関連付けられます。ただし、Tomcatはスレッドプールを使用するため、リクエストがすでに関連付けられているセッションを持つスレッドを受信する可能性があります。そのため、まったく新しいセッションを作成することすらできない可能性があります。もう1つは、で取得したセッションがsf.getCurrentSession()自動的にフラッシュされて閉じられることです。

一方、このメソッドsf.openSession()は新しいセッションを作成しますが、それをスレッドに関連付けようとはしません。ただしsf.openSession()、Hibernateに自動的に行わせるのではなく、ユーザーがセッションの終了とフラッシュを自分で処理することを期待するという点で、別の問題が発生することを忘れないでください。

sf.getCurrentSession()通常は十分です。sf.openSession()セッションが保存および管理される場所のより高いレベルの管理を提供および促進します。それは確かに高度なオプションです。

于 2012-04-09T12:23:24.750 に答える