Как установить сеанс Hibernate в сценарии Grails
Вопрос
Следующий скрипт 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() вызывается для недопустимого объекта домена.Я хотел бы выводить сообщения об ошибках в случае сбоя проверки, однако, похоже, для этого мне нужно будет установить сеанс гибернации.Кто-нибудь знает способ обойти это?
Решение
Найденный RunScript.groovy который устанавливает для вас сеанс гибернации, а затем запускает сценарии, которые вы указываете в качестве аргументов.Мне пришлось изменить исходный код со сценария Gant (выше) на простой:
// 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
Другие советы
Я делаю что-то подобное, и это работает для меня...
// 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)