15

我正在使用 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 的其他部分)缓存查询?

4

1 回答 1

26

当您想使用供应商特定的扩展时,您可以使用 unwrap 方法来获取供应商实现。例如,

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

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

如果您不想在代码中包含任何休眠导入,您也可以这样做

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

真正取决于您宁愿以哪种方式引入供应商依赖性。

我倾向于第一个,因为如果从您的依赖项中删除 hibernate 并发出一个大红色“嘿,您的开发人员正在更改它,这里有一个供应商依赖项”,它将失败并出现异常。而如果提供者不理解该提示,则它根本不会执行任何操作。

其他人宁愿容忍在代码中使用依赖于供应商的魔法字符串,而不是需要有一个编译时供应商依赖。

于 2010-08-25T21:12:23.840 回答