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