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 が機能を完了すると、新しく作成されたセッションは破棄されます。
私の理解は正しいですか?