更新された投稿:
私がこれを行う場合、コントローラーで:
def obj = new Test(name:"lol")
obj.save(flush:true)
obj.name = "lol2"
//a singleton service with nothing to do with obj
testService.dostuff()
/*
"obj" gets persisted to the database right here
even before the next println
*/
println "done"
Grails 2 ではなく Grails 1.3.7 でこの問題が発生する理由を誰か説明してもらえますか? 理由は何ですか?
私は、discard() を使用して基本的にコードを再構築できることを知っていますが、舞台裏で何が、なぜ起こっているのかに興味があります。ありがとう!
古い投稿:
テスト用の Grails アプリケーションがあります。ドメイン クラス test.Test が 1 つあります。
package test
class Test {
String name
static constraints = {}
}
また、サービス test.TestService があります。
package test
class TestService {
static scope = "singleton"
static transactional = true
def dostuff() {
println "test service was called"
}
}
そして、1 つのコントローラー test.TestController:
package test
class TestController {
def testService
def index = {
def obj = new Test(name:"lol")
obj.save(flush:true)
obj.name = "lol2"
testService.dostuff()
println "done"
}
}
では私は何をすべきか:
- ドメイン オブジェクトを作成する
- そのプロパティの1つを変更します
- シングルトン サービス メソッドを呼び出す
私が期待すること:
- obj.save() を呼び出さない限り、何もデータベースに永続化されません
代わりに何が起こるか:
- サービス呼び出しの直後に、Grails はデータベースに対して更新クエリを実行します。
この URL から次の構成を試しました: http://grails.1312388.n4.nabble.com/Turn-off-autosave-in-gorm-td1378113.html
hibernate.flush.mode="manual"
しかし、それは役に立ちませんでした。
Grails 1.3.7 でテストしましたが、Grails 2.0.3 にはこの問題はありません。
正確に何が起こっているのか、もう少し詳しい情報を教えてください。サービス呼び出しのために現在のセッションを終了する必要があり、オブジェクトがダーティであるため、サービス呼び出し後にデータベースに自動的に永続化されているようです。Hibernateで手動フラッシュモードを設定しても役に立たないことを理解していません。
前もって感謝します!