2013-02-02 69 views
0

我正在創建一個帶有幾個域類和控制器的新grails應用程序。我所有的控制器都有save(),update()和list()等工作方法。save(flush:true)不會刷新會話

def update(Long id, Long version) { 
    def crawlerConfigInstance = CrawlerConfig.get(id) 
    if (!crawlerConfigInstance) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: 'crawlerConfig.label', default: 'CrawlerConfig'), id]) 
     redirect(action: "list") 
     return 
    } 

    if (version != null) { 
     if (crawlerConfigInstance.version > version) { 
      crawlerConfigInstance.errors.rejectValue("version", "default.optimistic.locking.failure", 
        [message(code: 'crawlerConfig.label', default: 'CrawlerConfig')] as Object[], 
        "Another user has updated this CrawlerConfig while you were editing") 
      render(view: "edit", model: [crawlerConfigInstance: crawlerConfigInstance]) 
      return 
     } 
    } 

    crawlerConfigInstance.properties = params 

    if (!crawlerConfigInstance.save(flush: true)) { 
     render(view: "edit", model: [crawlerConfigInstance: crawlerConfigInstance]) 
     return 
    } 

    flash.message = message(code: 'default.updated.message', args: [message(code: 'crawlerConfig.label', default: 'CrawlerConfig'), crawlerConfigInstance.id]) 
    redirect(action: "show", id: crawlerConfigInstance.id) 
} 

這實際上是由IDE

然而,現在,我將應通過域對象的列表運行,並相應地更新它們的附加控制器的方法自動生成的/腳手架方法。獲取列表,更改屬性和驗證是成功的。

save(flush:true)不會拋出任何錯誤並按預期返回更新的域對象。但是,檢查休眠SQL語句,我看到的只有SELECTS,沒有更新。事實上,如果我在save()之後直接調用域對象上的delete(),我會在域對象上得到一個併發事務異常。

我控制器的方法看起來像

def doSomething() {  

    def results = CrawlerConfig.findAll(bQ) 

    results.each { crawlerConfigInstance -> 

      crawlerConfigInstance.needsReview = true 

      if (!crawlerConfigInstance.save(flush: true)) { 
       render(view: "show", model: [crawlerConfigInstance: crawlerConfigInstance]) 
       return 
      } 
    } 

    redirect(action: "list") 
} 

非常簡單。如果我檢查髒字段,needsReview在save()之前標記爲髒。 save()更新對象上的版本。

我目前仍然使用h2:mem作爲數據庫。

對我來說,它看起來像交易沒有完成。但我不明白爲什麼或如何才能完成。 POST之後

THX提前

編輯從的Ondrej

創建一個服務(其被注入並要求罰款)

package lizard 

進口org.springframework.transaction.annotation.Transactional

@Transactional class CrawlerConfigPersist enceService {

static transactional = true 

def checkRequirementsForCrawlerConfigList(String query) { 

    def results = CrawlerConfig.findAll(query) 

    results.each { crawlerConfigInstance -> 

     crawlerConfigInstance.needsReview = true 

     if (!crawlerConfigInstance.save(flush: true)) { 
      println crawlerConfigInstance.errors.getAllErrors() 
      return 
     } 

    } 
} 
} 

但這會導致完全一樣的行爲,一切正常,除了有上調休眠

+0

我忘了提及的東西:我使用的是當前grails 2.1.1,即使在Controller作品中創建新的對象,但不更新現有的對象。 –

+0

當你強行調用session.flush()時會發生什麼?你看到數據庫寫入或其他一些錯誤彈出? – Raphael

+0

什麼也沒有。當我調用executeUpdate()時,它會被強制寫入。但從來沒有當我打電話保存。我甚至試圖在hibernate會話mysqlf上打開一個事務,這個事務失敗了。 –

回答

0

移動你的方法保存(),更新()和列表(無更新語句)從控制器到服務。在做這件事之前,看看這裏並閱讀服務章節:http://grails.org/doc/latest/guide/services.html

+0

理解,但爲什麼它爲我的save(),update()和list()方法工作,但不適用於新創建的方法。這些也不是封裝在服務中,如自動生成的。 –

+0

我遵循了Ondrej的提示(thx),這導致了服務(更新後的原始文章)。但是,該服務具有完全相同的行爲,不會調用任何更新語句 –

+0

您可以嘗試更改DataSource。groovy:將dbCreate更改爲開發環境的「更新」。 然後,嘗試將failOnError:true作爲參數添加到save方法。 –