使用本机查询进行二级缓存失效

use*_*073 1 jpa jpa-2.0 jboss7.x

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

Rob*_*sen 5

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

使用JPA本机UPDATE/INSERT/DELETE查询会导致Hibernate使整个第二级实体缓存无效.正如你在问题中提到的,Hibernate有一个解决方法,但似乎不可能做相当于Hibernate addSynchronizedQuerySpace(),addSynchronizedEntityClass()addSynchronizedEntityName()使用纯JPA.

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

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

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