0

我正在创建一个带有多个域类和控制器的新 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")
}

很简单。如果我检查脏字段,needsReview 在 save() 之前被标记为脏。save() 更新对象的版本。

我目前仍然使用 h2:mem 作为数据库。

对我来说,交易似乎还没有完成。但我不明白为什么或如何才能完成它。

提前谢谢

Ondrej POST 后编辑

创建了一个服务(被注入并正常调用)

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
        }

    }
}
}

但这会导致完全相同的行为,一切看起来都很好,除了 hibernate 没有更新语句

4

1 回答 1

0

将 save()、update() 和 list() 的方法从控制器移到服务。在执行此操作之前,请查看此处并阅读服务章节: http: //grails.org/doc/latest/guide/services.html

于 2013-02-02T16:25:30.620 回答