GrailsコマンドオブジェクトでGORMドメインオブジェクトを使用すると、コマンドオブジェクトはsave()メソッドを呼び出していなくても自動的にドメインオブジェクトへの変更をコミットします。Grailsのコマンドオブジェクトは、デフォルトでドメインオブジェクトへの変更をコミットするのはなぜですか?
コマンドオブジェクトのGORMオブジェクトにバインドしますが、データベースに変更を保存したりコミットしたりする必要はありません。私のコントローラやサービスが例外をスローすると、トランザクションのロールバックが必要になります。
私は以下のアノテーションで必要な動作を強制することができますが、私はそれを難しい方法でやっているように感じています。
Controller Class = @Transactional(readOnly = true)
Controller action method = @Transactional
Command Object Class = @Transactional(readOnly = true)
Service Class = @Transactional
これらの注釈をすべて追加しない限り、Grailsドメインオブジェクトはコマンドオブジェクトによって自動的にコミットされるはずですか?
しかし、コマンドオブジェクトにバインドされたオブジェクトは、コマンドオブジェクトの後で、アクションの最後ではなくコントローラアクションの最初の行の前に暗黙的にコミットされます。上記のように注釈を付けない限り、私はコマンドオブジェクト内で1つのトランザクションを取得し、アクション内で別のトランザクションを取得するように見えます。 – DAC
これを示す小さなテストアプリを作成できますか?私は見てみたいので、Githubや他のオンラインリポジトリに取り組んでいたり、コードを解凍してメールしてもらえればうまくいけばそれを追うことができます。それが本当のバグなら、それを報告するのが良いでしょう。 –
OK、見つけました!デモアプリケーションには同じ動作がありませんでした。検証に役立つコマンドオブジェクトにUtilServiceを注入することで問題が発生していることが判明しました。そのサービスは** @Transactional(readOnly = true)という注釈付きではないので、トランザクションを開始し、そのトランザクションをコミットしたコントローラアクションに戻ります。 UtilService '@Transactional(readOnly = true)に注釈を付けると、問題が解決されました。 – DAC