【问题标题】:Can not retrieve new records for cached query无法检索缓存查询的新记录
【发布时间】:2015-03-22 01:25:25
【问题描述】:

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

现在我尝试在数据库中添加新记录。但它没有选择新记录。当我尝试分析日志时,我看到它只从数据库中一一挑选了所有现有记录。

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

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

刷新缓存的代码。

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

Product.java

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

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

我读了几篇文章,他们说我需要创建新的实体管理器。但是我正在使用 spring 在 GenericDAO 中注入 entityManager。所以我不能创建新的实体管理器。

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

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

【问题讨论】:

    标签: hibernate caching jpa ehcache


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多