Как установить сеанс Hibernate в скрипте Grails - PullRequest
4 голосов
/ 24 марта 2009

Следующий скрипт 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) 

терпит неудачу за исключением:

Ошибка при выполнении скрипта. Импорт: org.hibernate.HibernateException: Сеанс Hibernate не связан с потоком, и конфигурация не позволяет создавать нетранзакционный сеанс здесь

при вызове validate () для недопустимого объекта домена. Я хотел бы выводить сообщения об ошибках, когда проверка завершается неудачей, однако, мне кажется, что для этого мне нужно установить сеанс гибернации. Кто-нибудь знает способ преодолеть это?

Ответы [ 2 ]

3 голосов
/ 24 марта 2009

Найдено RunScript.groovy , который устанавливает сеанс гибернации для вас, а затем запускает сценарии, которые вы указываете в качестве аргументов. Мне пришлось сменить исходный код со сценария Ганта (см. Выше) на простой:

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

Я могу запустить его так:

$> сценарии запуска скриптов grails / Import.groovy

0 голосов
/ 02 сентября 2011

Я что-то вроде этого, и это работает для меня ...

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