HIbernate实体管理器:如何缓存查询?

时间:2010-08-25 20:35:58

标签: java hibernate caching jpa-2.0

我使用Hibernate 3.5.1和EntityManager进行数据持久化(使用JPA 2.0和EHCache 1.5)。我可以通过以下代码获取查询:

EntityManager em;
...
Query query = em.createQuery(...);
...

现在,问题是EntityManager的createQuery()方法返回javax.persistence.Query,与org.hibernate.Query(由SessionFactory的createQuery()方法返回)不同,它没有org.hibernate.Query.setCacheable ()方法。

那么,我应该如何使用EntityManager(或Hibernate的其他部分)缓存查询?

1 个答案:

答案 0 :(得分:25)

如果要使用特定于供应商的扩展,可以使用unwrap方法来获取供应商实现。如,

org.hibernate.Query hquery = query.unwrap(org.hibernate.Query.class);

然后您可以使用供应商特定的界面。或者,您可以在创建查询之前将EntityManager打开到Session

如果您不希望代码中有任何hibernate导入,您也可以

query.setHint("org.hibernate.cacheable", Boolean.TRUE);

真的由您决定以哪种方式引入供应商依赖。

我倾向于第一个,因为如果从你的依赖项中删除了hibernate会发送一个大红色,它将会失败,例如,嘿,你的开发人员改变了这个,这里有供应商依赖。“如果提供者不理解提示,那么提示就什么都不做。

其他人宁愿在代码中容忍依赖于供应商的魔术字符串而不是需要编译时供应商依赖。