Grailsのスクリプト内Hibernateセッションを確立する方法
質問
次の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のSessionはスレッドにバインド、およびコンフィギュレーションは、ここで非トランザクション1を作成することはできません。
検証()が無効なドメインオブジェクトで呼び出されたとき。検証が失敗したときに、私は、しかし、私がそうするために、Hibernateのセッションを確立する必要がありますそうです、出力エラーメッセージをしたいと思います。誰もがこの乗り越えるための方法を知っていますか?
解決
が見つかり<のhref = "http://naleid.com/blog/2008/03/31/using-gant-to-execute-a-groovy-script-within-the-grails-context-updated/"あなたのためのHibernateセッションをセットアップするのrel =「nofollowをnoreferrer」> RunScript.groovy のは、あなたが引数として指定したスクリプトを実行します。私は単純に(上記)ガントスクリプトからの私のソースを変更する必要がありました。
// 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の実行スクリプトのスクリプト/ Import.groovy
他のヒント
私はこのような何かをやっているし、それは私の作品...
// 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)
所属していません StackOverflow