1

ドメインには、複合 ID の 4 つの列部分があります。

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 エラー

例外なく。デバッガーをクラッシュさせません。なだ。後続のコマンドはすべて実行されます。ただし、オラクル側では、更新されたレコードは確実に未更新のままです。ここまで来るのにしばらく時間がかかりました (昨日まで .errors について知りませんでした)。gorm メソッドを使用して挿入と削除を行うことができます。save() が失敗する理由がわかりません。以前のように検証の問題が発生していません。一意ではない pk を持つような方法でフィールドを更新していません。そうすると、エラーがスローされると予想されます。

私がここに欠けているものはありますか?

これを更新するまでに、レコードを検索するための pk の一部を失ったため、rowid を使用してレコードを検索しています。Rowid は updateable false に設定されています。

[編集] 保存後に a.refresh() も試しました。これは失敗し、そのキーを持つレコードを見つけることができません (更新クエリを実際に実行していないため、予想どおりです。

4

1 に答える 1

3

複合 ID の一部であるフィールドを変更する場合は、古いインスタンスを削除して新しいインスタンスを作成する必要があります。それが私が以前に問題を解決した方法です。

于 2012-09-18T20:19:08.170 に答える