我正在創建一個帶有幾個域類和控制器的新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上打開一個事務,這個事務失敗了。 –