web-dev-qa-db-ja.com

HibernateのSessionfactory.getCurrentSession()とSessionFactory.openSession()の違い

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

SessionFactory.openSession()によってどのような付加価値が追加されますか?

18
tintin

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

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

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

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

38
Hardik Mishra