1

我有一个在 JBoss AS 7 安装(Infinispan 二级缓存提供程序)上使用二级缓存的应用程序。
我们有一些更新的 JPQL 查询使缓存无效——我想知道如果我们在应用程序中包含一些本机 SQL 查询会产生什么影响。查询缓存会失效吗?
我还记得在 Hibernate 上使用 sqlQuery.addSynchronizedQuerySpace("") 指令来防止某些本机 SQL 查询的缓存失效。JPA也可以做到吗?
谢谢!

4

1 回答 1

6

我今天在处理同样的问题时遇到了这个问题,所以我想我会在这里发布我的发现。

使用 JPA 原生 UPDATE/INSERT/DELETE 查询确实会导致 Hibernate 使整个2 级实体缓存无效。正如您在问题中提到的那样,Hibernate 有一个解决方法,但似乎不可能做与 Hibernate 等效的操作addSynchronizedQuerySpace()addSynchronizedEntityClass()addSynchronizedEntityName()使用纯 JPA。

然而,JPA 允许您做的是访问unwrapJPAQuery对象以访问 JPA 提供者的 API。如果您使用 Hibernate 作为 JPA 提供程序,那么这将允许您使用 Hibernate 的addSynchronizedXxx方法,如下所示:

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

这不是一个理想的解决方案,但它可以有效地防止整个二级缓存失效。

于 2014-09-12T03:03:49.203 回答