Come stabilire una sessione Hibernate all'interno di uno script graal
Domanda
Il seguente script graal:
// 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)
non riesce ad eccezione:
Errore di script in esecuzione di importazione: org.hibernate.HibernateException: No Hibernate Session legato a filo, e la configurazione non permette la creazione di uno non transazionale qui
quando validate () viene chiamato su un oggetto di dominio non valido. Mi piacerebbe uscita i messaggi di errore quando la validazione fallisce, tuttavia sembra che avrò bisogno di stabilire una sessione di Hibernate al fine di farlo. Qualcuno sa un modo per superare questo?
Soluzione
Trovato RunScript.groovy che imposta la sessione Hibernate per voi, allora esegue gli script specificati come argomenti. Ho dovuto cambiare la mia fonte da uno script di Gant (sopra) per semplicemente:
// 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)
Sono in grado di farlo funzionare in questo modo:
$> graal script run-script / Import.groovy
Altri suggerimenti
che sto facendo qualcosa di simile e funziona per me ...
// 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)