2013-02-25 7 views
7

:私が欲しいものクエリHibernateのキャッシュ

Person a = new Person(); 
a.setName("John"); 

Session session = openHibernateSession(); 

session.beginTransaction(); 

session.saveOrUpdate(a); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 

... 

session.commit(); 

は、データベースとHibernateのキャッシュの両方からオブジェクトを検索する機能を持つことです。次の例は、uniqueResultを呼び出すとnullを返します。まだデータベースにコミットされていない保存されたオブジェクトを取得する方法はありますか?

答えて

1

ID以外を検索している場合、Hibernateは第1レベルのキャッシュを使用しません。 Hibernateの取得とロードは、デフォルトでは第1レベルのキャッシュに関連していますが、条件のクエリはありません。あなたのケースでは、セッションからのデータは、IdはGEが生成されますので、データベースに同期すると、結果の基準クエリの意志としてされるようにしながら、セッションが=ちょうどこのsession.flush();ようなあなたのセッションをフラッシュフラッシュすることによって私の側

  1. から2つの解決策があります結果をデータベースで検索し、結果リストを表示します。

  2. は二次キャッシュを休止有効=あなたはEhcacheのような休止状態キャッシュ・プロバイダーによって、第2レベルのキャッシュを有効にしてトリックを適用することができます。

0

あなたはStatelessSessionを使用することができますが、警告が表示さ: それらentitysがどのセッションにバインドされていないとあなたが関係や怠惰なフィールドを解決したい場合は、例外を取得します!

0
session.beginTransaction(); 

session.saveOrUpdate(a); 

session.flush(); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 
0

TestNgテストフレームワークを使用している点を除いて、いくつかの同様のことがあります。答えのいくつかは、session.flush()メソッド呼び出しについて議論しています。これは正しいです。フラッシュする呼び出しは、必ず、すべてのデータベースは、キューから実行され、クリアされ、現在キューで待機して呼び出すことを行うことなど、いくつかのことを、行うために休止状態に指示します。

0

は、それはあなたのユーザ名に基づいて選択された場合でも、データを返します。ヌルが返されません。

関連する問題