1

域有 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() 。这失败了,它无法找到具有该键的记录(这是您所期望的,因为它实际上并没有运行更新查询。

4

1 回答 1

3

如果您更改作为复合 ID 一部分的字段,恐怕您将不得不删除旧实例并创建一个新实例。这就是我之前解决问题的方法。

于 2012-09-18T20:19:08.170 回答