2016-07-07 18 views
0

私はGrailsの2.4.2を使用して、私のコントローラ-updateメソッドに次のコードを持っています設定されている場合でも、保存された:のGrails:データは、私はエラー

@Transactional 
def update(ErtIncommingInvoice ertIncommingInvoiceInstance) { 

    if (ertIncommingInvoiceInstance == null) { 
     notFound() 
     return 
    } 

    // Concurrent-Update Test 
    if (ertIncommingInvoiceInstance.version != params.version as int) { 
     flash.warning = "Another user changed the record! (Concurrent Update Error)" 
     ertIncommingInvoiceInstance.errors.rejectValue("ertInfo", "concurrent.update.error") 
     respond ertIncommingInvoiceInstance.errors, view:'edit' 
     return 
    } 

場合でもが、エラーが検出され、エラーオブジェクトが設定され、メソッドフローは実行されません

ertIncommingInvoiceInstance.save flush:true, failOnError: true 

データはすでにデータベース内で変更されています。 編集ビューは表示されますが、エラーは表示されず、フラッシュメッセージだけが表示されます。

推理で私のエラーはどこですか?

答えて

2

Grailsはsaveの前にvalidateを呼び出し、errorsオブジェクトに設定した内容を上書きします。さらに、Grailsは、メソッドの終了後にオブジェクトに自動的にsaveを呼び出します。変更したオブジェクト上でdiscard()に電話するか、withTransactionブロックを使用してトランザクションを永続化または作成したくない場合は手動でロールバックする必要があります。

0

@Gregorペトシーンは私が...同時更新をチェックして、他のユーザーから変更されたデータを再表示するために、今、次のコードを使用し、答えとして:

@Transactional 
def update(ErtIncommingInvoice ertIncommingInvoiceInstance) { 

    if (ertIncommingInvoiceInstance == null) { 
     notFound() 
     return 
    } 

    // Concurrent-Update Test 
    if (ertIncommingInvoiceInstance.version != params.version as int) { 
     ertIncommingInvoiceInstance.discard() 
     ertIncommingInvoiceInstance = ErtIncommingInvoice.get(params.id) 
     ertIncommingInvoiceInstance.errors.reject("concurrent.update.error") 
     respond ertIncommingInvoiceInstance.errors, view:'edit' 
     return 
    } 
関連する問題