域有 4 列组成一个复合 ID:
id composite: ['exemptionTermCode', 'exemptionCode', 'exemptionClassification', 'exemptionPayType']
在控制器中,一个 REST 服务的丑陋模仿,我有这个代码:
else if (request.method == "PUT" && params.rowid) {
def a = WaiverExemption.find("from WaiverExemption as e where e.exemptionRowId = ?", [params.rowid])
if (params.exemptionPay) a.exemptionPayType = params.exemptionPay
if (params.exemptionClassification) a.exemptionClassification = params.exemptionClassification
if (params.exemptionCode) a.exemptionCode = params.exemptionCode
if (params.exemptionPriority) a.exemptionPriority = parseLong(params.exemptionPriority)
if (params.exemptionTempFlag) a.exemptionTempFlag = params.exemptionTempFlag
a.exemptionUserId = session.licensePlate
a.save(flush: true, failOnError: true)
我在控制台上没有任何错误。我可以单步执行,并在监视窗口中查看模型对象,并且我看到正确的属性已更新。save() 完成后,我在 model.errors 中看到以下内容:
grails.validation.ValidationErrors:0 个错误
没有例外。不会使调试器崩溃。纳达。后续命令全部执行。但是,在 Oracle 方面,已更新的记录肯定仍未更新。我花了一段时间(直到昨天才知道 .errors)才走到这一步,我可以使用 gorm 方法进行插入和删除。我不明白为什么 save() 失败,我没有像过去那样遇到验证问题。我不会以不唯一 pk 的方式更新字段,如果我这样做了,我希望这会引发错误。
我在这里缺少什么吗?
我正在使用 rowid 来搜索记录,因为当我更新它时,我已经丢失了用于查找它的部分 pk。Rowid 设置为可更新的 false。
[编辑] 我也试过在保存后做 a.refresh() 。这失败了,它无法找到具有该键的记录(这是您所期望的,因为它实际上并没有运行更新查询。