2012-04-09 10 views
18

私は2つの間で少し混乱しています。どちらも私が両方のセッションを休止状態に戻すことを知っているので、SessionFactory.getCurrentSession()は、hibernate.cfg.xmlに設定された<property name="current_session_context_class">というプロパティに基づいてコンテキストセッションを返します。 私たちはいつもこのアプローチにしてはいけませんか?差分のHibernateのSessionfactory.getCurrentSession()とSessionFactory.openSession()

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

答えて

37

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

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

一方、メソッドsf.openSession()は、新しいセッションを作成しますが、スレッドに関連付けることを試みません。しかし、sf.openSession()は、ユーザーがHibernateに自動的にそれをさせるのではなく、セッション自体のクローズとフラッシュを処理することを期待しているという点で、別のヒントを紹介しています。

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

+1

これは、tomcat内のマルチスレッドにsf.getCurrentSessionを使用している場合、同じセッションを使用するのでしょうか?大丈夫ですか? – Dejell

関連する問題