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

时间:2013-09-27 15:33:19

标签: jpa jpa-2.0 jboss7.x

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

1 个答案:

答案 0 :(得分: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);

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