Como estabelecer uma sessão Hibernate dentro de um Grails roteiro
Pergunta
A seguir grails script:
// 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)
falha com a exceção:
Erro ao executar script de importação: org.hibernate.HibernateException: Não Hibernate Session obrigado a fio, e de configuração não permitir a criação de um não transacional aqui
quando validate () é chamado em um objeto de domínio inválido. Eu gostaria de saída as mensagens de erro quando a validação falhar, no entanto, parece que vou precisar para estabelecer uma sessão de hibernação, a fim de fazê-lo. Alguém sabe uma maneira de superar isso?
Solução
Encontrado RunScript.groovy que estabelece a sessão de hibernação para você, em seguida, executa os scripts que especificar como argumentos. Eu tive que mudar minha fonte de um script Gant (acima) simplesmente:
// 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)
Eu sou capaz de executá-lo assim:
$> roteiros grails run-script / Import.groovy
Outras dicas
Estou fazendo algo como isso e ele funciona para mim ...
// 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)