2009-03-23 9 views
4

Das folgende grails Skript etablieren:Wie eine Hibernate-Session innerhalb eines 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) 

mit Ausnahme fehlschlägt:

Fehler beim Ausführen von Skript Import: org.hibernate.HibernateException: Nein Hibernate Session gebunden einzufädeln und Konfiguration Erstellung von nicht-transaktions man nicht hier

erlauben, wenn validate() auf einer ungültigen Domain obj aufgerufen wird ect. 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. Wer weiß einen Weg daran vorbei?

Antwort

3

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 kann es wie so laufen:

$> Grails run-Skript scripts/Import.groovy

0

ich bin doint so etwas wie dieses 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)