私はjbossを使用しています.Hibernate基準クエリを使用してdbから読み取ったエンティティを実行するクラスがあります。
私はクエリを実装しました
// org.hibernate.Criteria crit ..
// crit.add(Restriction...
// crit.setProjections(...
List<MyObject> l = crit.list()
アプリケーションの実行中に、別のアプリケーションが db content を変更します。したがって、同じセッションで別の c.list() を使用して再度読み取ると、データは変更されていないように見えます。これは、休止状態のキャッシュが「古い」データを返すためです。
更新すると、次のようなことができます (EntityManager em から始めてセッションを取得します):
for (MyObject o : l) {
((Session)em.getDelegate()).refresh(o);
}
それは機能し、オブジェクトのコンテンツを更新し、更新されたデータはキャッシュではなくデータベースから取得されます。しかし、リスト内のすべてのオブジェクトを 1 つずつ更新するため、これは非常に非効率的です。
別の方法は、セッションを閉じて再度開くことですが、私はそうしません。
((Session)em.getDelegate()).setCacheMode(CacheMode.REFRESH)
私は withと withを試しましcrit.setCacheable(false)
たが、どちらの場合も、すべての読み取り実行がキャッシュからのデータの「古い」バージョンを返します。
キャッシュからではなくデータベースからクエリを実行するようにセッション/基準に設定するための提案はありますか? 私のアプリケーションの使用では、キャッシュは問題ありませんが、上記で説明したように、データベース上のデータが外部から、別のアプリケーションの別のセッションから変更される場合を除きます。
ありがとうございました