Comment établir une session Hibernate dans un script Grails
Question
Le script Grails suivant:
// 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)
échoue à l'exception:
Erreur exécution du script d'importation: org.hibernate.HibernateException: pas de Session lié à fil et la configuration ne permet pas la création d'un non transactionnel ici
quand validate () est appelée sur un objet de domaine non valide. Je voudrais transmettre les messages d'erreur lors de la validation échoue, mais il semble que je vais devoir établir une session de mise en veille prolongée afin de le faire. Quelqu'un connait un moyen de passer cela?
La solution
Trouvé RunScript.groovy qui met en place la session de mise en veille prolongée pour vous, puis exécute les scripts que vous spécifiez comme arguments. Je devais changer ma source d'un script Gant (ci-dessus) simplement:
// 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)
Je suis capable de l'exécuter comme ceci:
$> Grails scripts script run / Import.groovy
Autres conseils
Je suis en train de faire quelque chose comme ça et ça fonctionne pour moi ...
// 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)