![](/img/trans.png)
[英]How is flush: true different from manually flushing the currentSession?
[英]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.