2011-07-26 140 views
3

我想禁用休眠緩存。休眠禁用緩存

session.setCacheMode(CacheMode.IGNORE)不起作用。
query.setCacheable(false)也不起作用。

另外,我可以以某種方式配置緩存不會爲對象X,Y完成,但會爲對象Z完成嗎?

謝謝。

+1

您可以更具體地瞭解您所指的哪個* hibernate緩存?有會話/第一級緩存,第二級緩存,查詢緩存和集合緩存。 –

+0

我指的是會話緩存 – AAaa

回答

1

我搜查了網頁,結論是確實無法禁用會話緩存。 這很奇怪。 我自己的解決方案是使用session.clear()當我想清除緩存。

+0

不起作用,我已經嘗試過session.clear(); 仍然直接數據庫更新不顯示在休眠狀態。 請讓我知道,如果你已經找到了別的東西。 –

+0

爲我工作。您也可以嘗試關閉並打開新的會話。 –

3

配置你的hibernate session工廠時嘗試類似的東西:

configuration.setProperty(Environment.USE_QUERY_CACHE, Boolean.FALSE.toString()); 
configuration.setProperty(Environment.USE_SECOND_LEVEL_CACHE, Boolean.FALSE.toString()); 
configuration.setProperty(Environment.CACHE_REGION_FACTORY,org.hibernate.cache.impl.NoCachingRegionFactory.class.getName()); 
configuration.setProperty(Environment.CACHE_PROVIDER,org.hibernate.cache.NoCacheProvider.class.getName()); 

但是請注意,你無法禁用會話緩存是由Hibernate的(如果不是所有的JPA實現)提供。如果你真的不想被Hibernate緩存,你可以驅逐它或不使用休眠(對你更簡單)

至於緩存特定的實體,我建議你看看javax.persistence.Cacheable和看看這對你有用。

+0

你確定沒有辦法禁用會話緩存嗎?似乎很奇怪..如果我想在變更之前和之後comapre DB對象怎麼辦?是唯一的毒藥是使用驅逐嗎? – AAaa

+0

我很確定......當你處理Hibernate實體時,你正在處理會話的對象。對所述實體調用Session.get()應該返回相同的對象句柄(或所述實體的代理) –

7

在從管理器獲取可重用會話對象之前,您可以致電session.clear()

I.e.在我們的項目中,我們必須在許多休眠會話(每個http會話一次)之間同步更新。二級緩存工作正常,但第一級(每個會話)必須禁用或清除。因此,我們創建了SessionManager,它存儲所有會話並按需交付。在撥打電話session.clear()之前,這就解決了這個問題。

直到你在做你的工作單元 - 第一級緩存是好的。