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

eol*_*old 13 java caching hibernate jpa-2.0

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

EntityManager em;
...
Query query = em.createQuery(...);
...
Run Code Online (Sandbox Code Playgroud)

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

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

Aff*_*ffe 25

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

org.hibernate.Query hquery = query.unwrap(org.hibernate.Query.class);
Run Code Online (Sandbox Code Playgroud)

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

如果你不想在你的代码中有任何hibernate导入,你也可以这样做

query.setHint("org.hibernate.cacheable", Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)

真的取决于你,你宁愿引入供应商依赖.

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

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

  • @leden - 字符串已经在org.hibernate.ejb.QueryHints中,以避免重新发明轮子. (4认同)