2009-03-23 7 views
4

Le script Grails suivant:Comment établir une session Hibernate dans un script 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) 

échoue à l'exception:

Erreur exécution du script d'importation: org.hibernate.HibernateException: pas de Session lié à thread, et la configuration ne permet pas la création d'un non-transactionnel ici

lorsque validate() est appelée sur un domaine invalide obj ect. 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?

Répondre

3

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 exécuter des scripts-script/Import.groovy

0

Je suis doint 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) 
Questions connexes