2010-08-25 43 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