Cómo establecer una sesión de Hibernate dentro de un script griales
Pregunta
La siguiente griales script:
// 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)
falla con la excepción:
Error de escritura de la ejecución de importación: org.hibernate.HibernateException: No Session de Hibernate obligado a enhebrar, y la configuración no permite la creación de uno no transaccional aquí
cuando validate () se llama en un objeto de dominio no válido. Me gustaría dar salida a los mensajes de error cuando la validación falla, sin embargo, parece que voy a necesitar para establecer una sesión de hibernación con el fin de hacerlo. Alguien sabe una manera de superar esto?
Solución
Encontrados RunScript.groovy que establece la sesión de hibernación para usted, a continuación, ejecuta los scripts especificados como argumentos. Tuve que cambiar mi fuente de un guión Gant (arriba) para simplemente:
// 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)
Soy capaz de ejecutarlo así:
$> griales scripts de secuencias de comandos ejecutada / Import.groovy
Otros consejos
estoy haciendo algo como esto y funciona para mí ...
// 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)