4

次の grails スクリプト:

// Import.groovy

includeTargets << grailsScript("Bootstrap")

target(main: "Import some data...") {
    depends(bootstrap)

    def Channel = grailsApp.classLoader.loadClass("content.Channel")

    def c 

    // works: saving a valid Channel succeeds
    c = Channel.newInstance(title:"A Channel", slug:"a-channel", position:0).validate()

    // doesn't work: saving an invalid Channel fails with exception
    c = Channel.newInstance().validate()

    // this line is never reached due to exception
    println(c.errors)

}

setDefaultTarget(main) 

次の例外で失敗します。

スクリプトのインポートの実行中にエラーが発生しました: org.hibernate.HibernateException: スレッドにバインドされた Hibernate セッションがありません。構成では、ここで非トランザクションのセッションを作成することはできません

無効なドメイン オブジェクトに対して validate() が呼び出された場合。検証が失敗したときにエラー メッセージを出力したいのですが、そのためには休止状態のセッションを確立する必要があるようです。これを乗り越える方法を知っている人はいますか?

4

2 に答える 2

3

休止状態セッションをセットアップし、引数として指定したスクリプトを実行するRunScript.groovyを見つけました。ソースを Gant スクリプト (上記) から単純に次のように変更する必要がありました。

// Import.groovy

def Channel = grailsApp.classLoader.loadClass("content.Channel")

def c 
c = Channel.newInstance(title:"A Channel", slug:"a-channel", position:0).validate()
c = Channel.newInstance().validate()
println(c.errors)

次のように実行できます。

$> grails run-script scripts/Import.groovy

于 2009-03-24T18:12:16.107 に答える
0

私はこのようなことをしていますが、それは私にとってはうまくいきます...

// Import.groovy

includeTargets << grailsScript("Bootstrap")

target(main: "Import some data...") {
    depends(bootstrap)

    // added this ------------------------------------------------------
    def sessionFactory = appCtx.getBean("sessionFactory")
    def session = SessionFactoryUtils.getSession(sessionFactory, true)
    TransactionSynchronizationManager.bindResource(
        sessionFactory, new SessionHolder(session))
    // added this ------------------------------------------------------

    def Channel = grailsApp.classLoader.loadClass("content.Channel")

    def c 

    // works: saving a valid Channel succeeds
    c = Channel.newInstance(title:"A Channel", slug:"a-channel", position:0).validate()

    // doesn't work: saving an invalid Channel fails with exception
    c = Channel.newInstance().validate()

    // this line is never reached due to exception
    println(c.errors)

}

setDefaultTarget(main)
于 2011-09-02T10:59:53.960 に答える