我正在创建一个带有几个域类和控制器的新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
}
}
}
}
但这会导致完全一样的行为,一切正常,除了有上调休眠
我忘了提及的东西:我使用的是当前grails 2.1.1,即使在Controller作品中创建新的对象,但不更新现有的对象。 –
当你强行调用session.flush()时会发生什么?你看到数据库写入或其他一些错误弹出? – Raphael
什么也没有。当我调用executeUpdate()时,它会被强制写入。但从来没有当我打电话保存。我甚至试图在hibernate会话mysqlf上打开一个事务,这个事务失败了。 –