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?

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top