【发布时间】:2017-10-25 09:48:23
【问题描述】:
我在 Grails 2 2.5 应用程序中遇到了一个令人费解的情况,我的域对象没有被持久化到 MySQL 数据库,但没有返回任何错误。我已经使用 Grails 多年,所以我认为我已经避免了更明显的陷阱,而且我以前从未见过这个陷阱。代码如下:
if (sale.save(flush:true,failOnError: true)) {
println "nettTotal = "+sale.nettTotal
map.response = "OK"
map.sale = sale
} else {
map.error = "Unable to save sale"
sale.errors.allErrors.each {
println it
}
}
当我运行它时,我看到消息“nettTotal = 290.36”,表明域对象实际上已被保存就 Grails 而言(我没有看到任何错误,如果它有失败的)。然而,当我在 MySQL 数据库中进行选择时,我看到有问题的行保持不变('nett_total' 保持 NULL,其他列也保持不变)。
代码在控制器中运行,没有任何可能无法提交的显式事务。我不知道还能去哪里看。它必须是简单的东西,但我被困住了。
(我不确定这是否相关,但在过去的几周里,这个应用程序一直存在奇怪的问题,存在虚假错误,表明存在某种零星的损坏。例如,以前工作的 findBy* 动态方法突然开始抛出错误,已通过应用程序的“深度清理”清除,即grails clean 并删除了 .grails/2.2.5/projects 中的项目目录。昨天我从未更改的代码中遇到了一个完全神秘的 JSON 错误以前有效,但再次通过深度清洁清理。我不知道为什么会发生这种情况,但它让我担心,我想阻止它)。
【问题讨论】:
-
您是否尝试过在您的数据源
logSql=true中启用sql 日志记录?可能会给你一些提示 -
好主意。我刚刚尝试过,结果相当令人惊讶(尽管与数据库的状态一致)。 save() 调用不会导致更新或插入。就好像从来没有发生过一样。那里明显有问题。
-
顺便说一句,这不是一般问题 - 其他更新正常。
-
你的数据源被搞砸了,应用程序是例如使用内存数据源?
-
不,数据源很好。我已经找到了问题的原因以及如何防止它,尽管仍然有一些明显的错误。这是我的答案。
标签: grails