簡體   English   中英

save(flush:true)不刷新會話

[英]save(flush: true) is not flushing the session

我正在用幾個域類和控制器創建一個新的grails應用程序。 我所有的控制器都有save(),update()和list()的工作方法,例如

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")
}

非常簡單。 如果我檢查臟字段,則save()之前將needsReview標記為臟。 save()更新對象的版本。

我目前仍將h2:mem用作數據庫。

對我來說,交易似乎還沒有完成。 但是我不知道為什么或如何完成它。

提前Thx

從Ondrej開機自檢后編輯

創建了一個服務(注入並稱為罰款)

package lizard

導入org.springframework.transaction.annotation.Transactional

@Transactional類CrawlerConfigPersistenceService {

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
        }

    }
}
}

但這會導致完全相同的行為,一切看起來都很好,只是休眠沒有引發更新語句

將save(),update()和list()的方法從控制器移動到服務。 在進行此操作之前,請先在此處查看並閱讀“服務”一章: http : //grails.org/doc/latest/guide/services.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM