Wie eine Hibernate-Session innerhalb eines grails Skript etablieren
Frage
Das folgende grails Skript:
// 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)
nicht mit der Ausnahme:
Fehler beim Ausführen von Skript Import: org.hibernate.HibernateException: Nein Hibernate Session einzuzufädeln gebunden und Konfiguration Erstellung von nicht-transaktions einer hier nicht erlauben
, wenn validate () auf einem ungültigen Domain-Objekt aufgerufen. Ich möchte die Fehlermeldungen ausgegeben werden, wenn die Validierung fehlschlägt, aber es scheint, ich brauche eine Hibernate-Sitzung einzurichten, um dies zu tun. Jeder, der einen Weg kennen zu lernen Vergangenheit das?
Lösung
Gefunden RunScript.groovy die die Hibernate-Session für Sie einrichtet, dann die Skripte, die Sie als Argument angeben. Ich musste meine Quelle von einem Gant Skript ändern (siehe oben) zu einfach:
// 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)
Ich bin in der Lage es wie so läuft:
$> Grails run-Skript scripts / Import.groovy
Andere Tipps
ich so etwas wie dies tue und es funktioniert für mich ...
// 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)