无法检索缓存查询的新记录



经过JPA(休眠实现)缓存的小斗争,我终于能够缓存JPA查询了。当我更新数据库中的一些现有记录并使用 evictAll() 方法刷新缓存时,它也会刷新缓存。到目前为止,它工作得很好。

现在我尝试在数据库中添加新记录。但它不会选择新记录。当我尝试分析日志时,我看到它仅从数据库中逐个选择所有现有记录。

例如下面是我的代码。产品是我的实体类。

final Query q = entityManager.createQuery("from Product");
q.setHint("org.hibernate.cacheable", false);
q.getResultList();

用于刷新缓存的代码。

entityManager.getEntityManagerFactory().getCache().evictAll();

产品.java

@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Entity
public class Product {
    // Attributes
}

我的产品表中有 5 行。当我缓存时,它缓存了所有主键 P1、P2、P3、P4 和 P5。当我添加新记录并刷新/清除缓存时,它会为所有五个现有行触发五个查询以获取更新的值。但它不会触发原始查询来检索所有产品。

我读了几篇帖子,他们说我需要创建新的实体管理器。但是我正在使用弹簧在通用DAO中注入实体管理器。所以我不能创建新的实体管理器。

注意:我是通过某些数据库工具而不是通过我的应用程序将新记录插入数据库的。

我想在刷新缓存后检索新记录。请帮忙。

我找到了答案。下面的代码做到了。但它是休眠特定的解决方案。

((Session) entityManager.getDelegate()).getSessionFactory().getCache()
                .evictDefaultQueryRegion();

有人知道JPA特定的代码吗?

最新更新