2010-02-10 66 views
2

在我的grails應用程序中,我的某些域類永遠不會被用戶更改。如何暫時禁用Grails中的只讀第二級緩存休眠策略?

但是,有些維護工作有時是必需的,管理員應該能夠不時地創建/編輯少數實例(比如說每年兩次)。

我想爲這些域類設置一個只讀的二級緩存策略(static mapping = { cache usage: 'read-only' }),並且我希望能夠「禁用」(在特定情況下)只讀策略以便更新一些通過Grails腳手架編輯視圖的實例。

可能嗎?你建議我做什麼?

編輯:我正在執行的解決方案是Pascal和Burt答案的混合(請參閱註釋)。兩個答案都很好,很有幫助。所以,我選擇接受的答案讓人困惑不已。無論如何,謝謝。

回答

3

這可能是可能的,但最有可能不平凡。我會使用groovy.sql.Sql直接插入。你失去了驗證,但你可以創建實例並驗證它們,但不能調用save()。然後,如果他們確定就插入SQL,例如

def thing = new Thing(params) 
if (thing.validate()) { 
    new Sql(dataSource).executeInsert(
      "insert into thing(name) values(?)", [params.name]) 
} 
else { 
    // report validation error 
} 
+0

Thx爲您的答案。插入新的對象將會起作用,但是當更新現有的對象時,我需要將第二級緩存「刷新」到正確的位置? (因爲否則用戶將永遠看不到更改)。我需要使用evict()方法嗎? – fabien7474 2010-02-11 07:41:39

+1

是的,非常好的一點。將「def sessionFactory」添加到您的服務中,並在插入後調用sessionFactory.evict(YourDomainClass)以清除二級緩存。 – 2010-02-11 07:55:06

3

我會使用純SQL有關實體進行更新,然後進行必要的evict()方法對SessionFactory調用從二級緩存中刪除特定的實體。請注意,您也可能需要從evictCollection()中刪除收藏中的實體。有關驅逐的詳細信息,請查看nice blog post

封裝所有這些服務(例如wipeBooksFromGlobalCache())比管理員可以在您提到的特定情況下調用。

+0

嗨帕斯卡。我一定需要使用evict()方法來刷新二級緩存。但是一旦被驅逐,我能夠用只讀緩存策略更新現有的實例嗎? – fabien7474 2010-02-11 07:45:15

+1

@ fabien7474只讀緩存意味着它不被更新,不是實體是隻讀的,不能被更新。換句話說,您可以1.更新實體並2. evict()它們,以便它們將被重新加載到二級緩存中(即,使更改「可見」)。 – 2010-02-11 15:05:53

+0

Thx很多!我知道了! – fabien7474 2010-02-11 16:46:20