0

いくつかのドメイン クラスとコントローラーを使用して、新しい grails アプリを作成していました。すべてのコントローラーには、save()、update()、および list() の機能するメソッドがあります。

def update(Long id, Long version) {
    def crawlerConfigInstance = CrawlerConfig.get(id)
    if (!crawlerConfigInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'crawlerConfig.label', default: 'CrawlerConfig'), id])
        redirect(action: "list")
        return
    }

    if (version != null) {
        if (crawlerConfigInstance.version > version) {
            crawlerConfigInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                    [message(code: 'crawlerConfig.label', default: 'CrawlerConfig')] as Object[],
                    "Another user has updated this CrawlerConfig while you were editing")
            render(view: "edit", model: [crawlerConfigInstance: crawlerConfigInstance])
            return
        }
    }

    crawlerConfigInstance.properties = params

    if (!crawlerConfigInstance.save(flush: true)) {
        render(view: "edit", model: [crawlerConfigInstance: crawlerConfigInstance])
        return
    }

    flash.message = message(code: 'default.updated.message', args: [message(code: 'crawlerConfig.label', default: 'CrawlerConfig'), crawlerConfigInstance.id])
    redirect(action: "show", id: crawlerConfigInstance.id)
}

これは実際には IDE によって自動生成/スキャフォールディングされたメソッドです

ただし、ドメイン オブジェクトのリストを実行し、それに応じて更新するコントローラー メソッドを追加していました。リストの取得、属性の変更、および検証が成功しました。

save(flush:true) はエラーをスローせず、期待どおりに更新されたドメイン オブジェクトを返します。ただし、休止状態の SQL ステートメントを確認すると、SELECTS のみが表示され、更新はありません。実際、save() の後にドメイン オブジェクトで直接 delete() を呼び出すと、ドメイン オブジェクトで同時トランザクション例外が発生します。

私のコントローラーメソッドは次のようになります

def doSomething() {     

    def results = CrawlerConfig.findAll(bQ)

    results.each { crawlerConfigInstance ->

            crawlerConfigInstance.needsReview = true

            if (!crawlerConfigInstance.save(flush:  true)) {
                render(view: "show", model: [crawlerConfigInstance: crawlerConfigInstance])
                return
            }
    }

    redirect(action: "list")
}

かなり簡単です。ダーティ フィールドをチェックすると、save() の前に needsReview がダーティとしてマークされます。save() は、オブジェクトのバージョンを更新します。

現在、データベースとして h2:mem を使用しています。

私にとっては、トランザクションが終了していないようです。しかし、なぜ、またはどのようにそれを終了させることができるのかわかりません。

事前にThx

Ondrej からの投稿後に編集

サービスを作成しました(これは注入され、正常に呼び出されます)

package lizard

import org.springframework.transaction.annotation.Transactional

@Transactional クラス CrawlerConfigPersistenceService {

static transactional = true

def checkRequirementsForCrawlerConfigList(String query) {

    def results = CrawlerConfig.findAll(query)

    results.each { crawlerConfigInstance ->

        crawlerConfigInstance.needsReview = true

        if (!crawlerConfigInstance.save(flush: true)) {
            println crawlerConfigInstance.errors.getAllErrors()
            return
        }

    }
}
}

しかし、これはまったく同じ動作になります。休止状態によって発生する更新ステートメントがないことを除いて、すべてが問題ないように見えます

4

1 に答える 1

0

save()、update()、list() のメソッドをコントローラーからサービスに移動します。それを行う前に、ここを見てサービスの章を読んでください: http://grails.org/doc/latest/guide/services.html

于 2013-02-02T16:25:30.620 に答える