7

次のコードがあります。

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 のキャッシュの両方からオブジェクトを検索できるようにすることです。次の例では、呼び出し時に null を返しますuniqueResult。まだデータベースにコミットされていない保存済みオブジェクトを取得する方法はありますか?

4

5 に答える 5

1

ID 以外を検索する場合、Hibernate は一次キャッシュを使用しません。Hibernate の get と load はデフォルトで一次キャッシュに関連していますが、基準クエリはそうではありません。あなたの場合、私の側から2つの解決策があります

  1. セッションをフラッシュする=セッションsession.flush();からのデータがデータベースに同期される間、このようにセッションをフラッシュするだけで、IDが生成され、その結果、基準クエリはデータベースで結果を見つけ、結果リストを表示します.

  2. 休止状態のセカンド レベル キャッシュを有効にする = ehCache などの休止状態のキャッシュ プロバイダーによってセカンド レベル キャッシュを有効にし、このトリックを適用できます。

于 2013-02-25T13:15:59.703 に答える
0

TestNgテストフレームワークを使用することを除いて、いくつかの同様のことを行います。回答のいくつかは、session.flush()メソッドの呼び出しについて説明しています。正解です。フラッシュの呼び出しは、キューで現在待機しているすべてのデータベース呼び出しが実行され、キューからクリアされることを確認するなど、いくつかのことを行うようにHibernateに指示します。

于 2013-03-14T20:25:04.373 に答える
0

StatelessSession を使用できますが、注意してください: これらのエンティティはどのセッションにもバインドされていないため、リレーションや遅延フィールドを解決したい場合は例外が発生します!

于 2013-02-25T13:58:06.223 に答える
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();
于 2013-03-08T01:46:04.357 に答える