经过JPA(Hibernate Implementation)缓存的小小挣扎,我终于能够缓存JPA查询了。当我更新数据库中的一些EXISTING记录并使用evictAll()方法刷新缓存时,它也会刷新缓存。到目前为止,它完美无缺。
现在我尝试在数据库中添加新记录。但它没有选择新纪录。当我尝试分析日志时,我看到它只从数据库中挑选出所有现有记录。
e.g。 以下是我的代码。产品是我的实体类。
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。所以我无法创建新的实体管理器。
注意:我通过一些数据库工具而不是通过我的应用程序将新记录插入数据库。
我想在刷新缓存后检索新记录。请帮忙。
答案 0 :(得分:0)
我找到了答案。下面的代码就行了。但它是hibernate特定的解决方案。
((Session) entityManager.getDelegate()).getSessionFactory().getCache()
.evictDefaultQueryRegion();
有人知道JPA特定的代码吗?