4

Grails ドメイン オブジェクトの beforeDelete() イベント内でサービスを呼び出したいと考えています。残念ながら、イベントが発生すると、常に再現可能にクラッシュします。問題を再現する例を作成しました。ドメイン オブジェクト:

class Gallery {

    def myService

    def beforeDelete() {
            // System.out.println(myService); // not even this works, same error!
        System.out.println(myService.say());
    }
}

サービス:

class MyService {

    String say() {
        "hello"
    }
}

テスト コントローラー:

class DeleteController {

    def index() {

        Gallery.list().each {
            it.delete()
        }
    }

    def create() {
        def gallery = new Gallery()
        gallery.save()
    }
}

アプリケーションを起動し、create に続いて index を呼び出すと、次のようになります。

Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [testbeforedelete.Gallery#1]

私が達成したいことは、この例よりも少し複雑なサービスを呼び出すことです。この振る舞いを説明することはできず、これに対処する方法もわかりません。Hibernate イベントには特別な注意が必要であることはわかっていますが、立ち往生しています。

4

1 に答える 1

5

beforeDelete は実際にドメインクラスに変更を加えます。この動作を期待しないことに同意します。Hibernate は、インスタンスを変更していると考えます。次のコードを使用して問題を回避できます

def beforeDelete() {
    Gallery.withNewSession {
        System.out.println(myService.say());
    }
}
于 2013-03-23T13:06:12.583 に答える