1

更新された投稿:

私がこれを行う場合、コントローラーで:

     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で手動フラッシュモードを設定しても役に立たないことを理解していません。

前もって感謝します!

4

1 に答える 1

0

あなたがリンクしたそのスレッドについて、それがうまくいくとあなたが思った理由はわかりません. 彼らは皆、うまくいかないと言いました。作成されたチケットは修正されないため、クローズされました。ここでの解決策は、スレッドが述べたように、discard() を使用することです。

于 2012-07-18T22:45:08.297 に答える