2010-08-25 61 views
12

我正在使用Hibernate 3.5.1和EntityManager进行数据持久性(使用JPA 2.0和EHCache 1.5)。HIbernate实体管理器:如何缓存查询?

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

现在的问题是,EntityManager的的createQuery()方法返回javax.persistence.Query,不像为org.hibernate.Query(由SessionFactory的的的createQuery()返回:我可以通过下面的代码获得查询方法),没有org.hibernate.Query.setCacheable()方法。

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

回答

24

您可以使用解包的方法来获得在供应商的实现,当你想使用供应商特定的扩展。例如,

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

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

如果你不想在你的代码中的任何休眠进口,你也可以做

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

真的取决于你哪种方式,你宁愿引进供应商的依赖。

我赞成第一,因为它会与一个异常,如果Hibernate是从你的依赖发送了一个大红色的删除失败“这里嘿,你开发商更改此,有一个供应商的依赖。”然而,如果供应商无法理解提示,提示根本就不会做任何事情。

其他人宁愿忍受其供应商代码依赖魔法串上需要有一个编译时供应商的依赖。

+1

谢谢你的提示。 我将使用“供应商特定的魔术字符串”从一个恒定holder类(如HibernateHintConstants),这将确保如果我删除休眠时生成编译错误输入字符串(只要我还记得与相关的常量删除类到Hibernate特有的提示)。 – eold 2010-08-26 11:07:22

+4

@leden - 字符串已经在org.hibernate.ejb.QueryHints中,以避免重新发明轮子。 – OrangeDog 2011-01-31 16:20:42

+0

您还可以在@NamedQuery注释中添加提示 – OrangeDog 2011-01-31 16:24:28