1

JBoss AS 7 インストール (Infinispan 2nd レベル キャッシュ プロバイダー) で 2nd レベル キャッシュを使用するアプリケーションがあります。
キャッシュを無効にするいくつかの更新 JPQL クエリがあります。アプリケーションにネイティブ SQL クエリを含めると、どのような影響があるのでしょうか。クエリ キャッシュは無効になりますか?
また、一部のネイティブ SQL クエリのキャッシュの無効化を防ぐために、Hibernate で sqlQuery.addSynchronizedQuerySpace("") 命令を使用したことを覚えています。JPAでもできますか?
ありがとう!

4

1 に答える 1

6

今日同じ問題を扱っているときにこの質問に出くわしたので、ここに調査結果を投稿すると思いました。

JPA ネイティブの UPDATE/INSERT/DELETE クエリを使用すると、Hibernate は第 2 レベルのエンティティ キャッシュ全体を無効にします。質問で述べたように、Hibernate にはこれに対する回避策がありますが、Hibernate と同等のことを行うことはできず、addSynchronizedQuerySpace()純粋な JPAaddSynchronizedEntityClass()を使用することはできないようです。addSynchronizedEntityName()

ただし、JPA でできることはunwrap、JPAQueryオブジェクトにアクセスして JPA プロバイダーの API にアクセスすることです。addSynchronizedXxxHibernate を JPA プロバイダーとして使用している場合、これにより、次のように Hibernate のメソッドを使用できるようになります。

Query query = entityManager.createNativeQuery("UPDATE user SET ...");
query.unwrap(org.hibernate.SQLQuery.class)
        .addSynchronizedEntityClass(User.class);

これは理想的な解決策ではありませんが、2 番目のレベルのキャッシュ全体が無効になるのを効果的に防ぐことができます。

于 2014-09-12T03:03:49.203 に答える