0

Hibernate キャッシュと Spring の HibernateTemplate をもう少し深く掘り下げようとしていますが、次の質問にちょっと混乱しています。

1) HibernateTemplate は Hibernate セッションをどのように管理しますか? "getHibernateTemplate().find" や "getHibernateTemplate().execute()" などのメソッドを呼び出すと、HibernateTemplate が新しい Hibernate セッションを開いて処理するたびに処理されますか?

2) Hibernate 1st キャッシュは、Hibernate セッションの範囲内で機能します。この点で、HibernateTemplate が実行/検索するために常に新しいセッションを開く場合、Hibernate の最初のキャッシュが HibernateTemplate で使用できないことを意味しますか? (キャッシュされたオブジェクトはとにかく破棄され、次の find() はDBからすべてを再度取​​得するために新しいクエリを作成する必要があるため)

3) Hibernate の最初のキャッシュは、セッションの存続期間中にフェッチされたすべてのオブジェクトのマップを保持しているようです。この場合、同じセッションで以前にフェッチされたオブジェクトを照会すると、オブジェクトとそのすべてのデータをキャッシュから直接取得する必要がありますか? これに関して、このオブジェクトのデータがデータベースで変更された場合はどうなりますか?

4) Hibernate の最初のキャッシュはオブジェクトの形式でデータを返します。これに関して、HQL を使用してテーブル (オブジェクト) からいくつかの列 (属性) のみをフェッチすると、それらのデータ (属性の一部のみが満たされているオブジェクト)もキャッシュされますか?

どうもありがとう!

- - - - - - - - - - - - - 追加情報 - - - - - - - - - - - ----

Alessio からのヒントのおかげで、Spring の仕様を再確認したところ、次のように理解しました。

既存のトランザクション ブロック内 (たとえば、"session.beginTransaction();" の背後) で getHibernateTemplate() を呼び出すと、HibernateTemplate は既存のトランザクションを使用して実行します。

現在のスレッドでトランザクションなしで getHibernateTemplate() を呼び出すと、getHibernateTemplate() は実際には "getCurrentSession()" ではなく "openSession()" を呼び出します。セッションはすでに現在のスレッドにバインドされています)、新しいセッションが作成され、getHibernateTemplate() に渡されます。getHibernateTemplate が機能を完了すると、新しく作成されたセッションは破棄されます。

私の理解は正しいですか?

4

1 に答える 1

2

Springのドキュメントには、セッションのアクセスと作成について次のように記載されています。

「HibernateTemplate は、たとえば HibernateTransactionManager を使用する場合など、現在のスレッドにバインドされた対応するセッションを認識しています。allowCreate が true の場合、何も見つからない場合は新しい非トランザクション セッションが作成され、操作の最後に閉じる必要があります。 . false の場合、この場合 IllegalStateException がスローされます。

したがって、新しいセッションを作成するかどうかは、allowCreateプロパティと、現在のスレッドのセッションを設定するインターセプターの存在に依存します。HibernateTemplateHibernate の にフォールバックできることにも注意してくださいSessionFactory.getCurrentSession()

- - - - - - - - - - - - - 追加情報 - - - - - - - - - - - ----

編集:著者による追加の質問に答えるために、ドキュメントはこれについてあまり明示的ではありませんが、セッションが呼び出されたときに取得または作成されます。これにはもちろんのgetSession()呼び出しが含まれます。HibernateTemplate をインスタンス化するか、アプリケーション コンテキストから取得するだけの場合は、おそらくexecute()への呼び出しのように、セッションが作成またはアクセスされることはありません。getHibernateTemplate()

于 2013-06-07T09:07:37.100 に答える