2017-03-13 3 views
0

Grails 2.4.5(Hibernate 3)からGrails 3.1.15(Hibernate 4)に移行しており、コントローラの一部の動作がこれ以上動作しないことに気付きました。エラーなしで検証後にオブジェクトが永続化されない

私はこのアクション次のアクション(簡体字)

def create() { 
     def myDomainObject = myDomainservice.getDefault() 
     if (myDomainObject.validate()) { 
      myDomainObject.save() 
      render 'OK' 
     } else { 
      render 'WRONG' 
     } 
} 

を持っているが、検証にエラーが返されていないときにオブジェクトが作成されたGrailsの2にうまくいきました。

Grails 3ではこれはもう真実ではありません。アクションコールはエラーなしで実行されますが、オブジェクトはdbに格納されません(ただし、idは割り当てられています)。

いくつかのトラブルシューティングの後で、validate()を呼び出すと、何らかの理由でsave()(validate()が問題を検出しない)を無視するという結論に達しました。

@Transactionalを追加するか、または明示的にフラッシングするsave(flush:true)を追加すると問題が解決されます。

私は古い行動を取り戻すことができますか?

私はhibernate.flush.mode = AUTOを確認しましたが、どちらのバージョンでも同じです。

+0

あなたのコントローラのアクションはトランザクションではありません。サービスを移動するか、MyObject.withTransaction {// do something}を追加してみてください。あなたがサービスを呼んでから、コントローラを使って喜んでいるものを取得してから、それはむしろ逆のように思えるはずです – Vahid

答えて

0

少なくともGrailsチームは、コントラクトのコアアプリケーションロジック(ドメインを保存する)をお控えください。separation of consernsです。

サービスにあなたのロジックを移動しよう(彼らはデフォルトで取引されている、つまりは@Transactionalでアノテートされている)、あなたは一度に2つのゴールカバー:

  1. クリーナーコード
  2. 作業する機能
関連する問題