4 Stimmen

Wie man eine Hibernate-Sitzung innerhalb eines Grails-Skripts einrichtet

Das folgende 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) 

scheitert mit der Ausnahme:

Fehler beim Ausführen des Skripts Import: org.hibernate.HibernateException: Keine an einen Thread gebundene Hibernate-Sitzung, und die Konfiguration lässt die Erstellung einer nicht-transaktionalen Sitzung nicht zu

wenn validate() für ein ungültiges Domänenobjekt aufgerufen wird. Ich würde gerne die Fehlermeldungen ausgeben, wenn die Validierung fehlschlägt, aber es scheint, dass ich eine Hibernate-Sitzung einrichten muss, um dies zu tun. Kennt jemand einen Weg, dies zu umgehen?

3voto

dstnbrkr Punkte 4265

Gefunden RunScript.groovy das die Hibernate-Sitzung für Sie einrichtet und dann die Skripte ausführt, die Sie als Argumente angeben. Ich musste meine Quelle von einem Gant-Skript (siehe oben) zu einem einfachen Skript ändern:

// 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 so laufen lassen:

$> grails run-script skripte/Import.groovy

0voto

cowabunga1984 Punkte 75

Ich mache etwas Ähnliches und es funktioniert bei mir...

// 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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X