Grails не использует мой источник данных при запуске или тестировании? - PullRequest
0 голосов
/ 15 сентября 2011

Обратите внимание, что я использую Grails 2.0.0 Milestone 2.

Я получаю ошибку Hibernate createQuery is not valid without active transaction, когда я пытаюсь развернуть WAR / развернуть приложение Grails или запустить приложение, используя prod run-app/ test run-app. Если я использую просто run-app, все работает как положено.

Мне интересно, что может отличаться между prod run-app и war, что могло бы вызвать мой источник данныхне правильно подключен?

Вот мой DataSource.groovy файл:

dataSource {
    dbCreate = "none" 
    url = "jdbc:mysql://something/mydb"
    pooled = true
    dialect = org.hibernate.dialect.MySQLDialect
    username = "xxxxxx"
    password = "xxxxxxxxx"
    driverClassName = "com.mysql.jdbc.Driver"
}

hibernate {
    config.location = "classpath:some/hibernate/file.cfg.xml"
}

И у меня есть такой сервис:

package org.dostuff

import org.dostuff.DaoFactory;
import org.springframework.transaction.annotation.Transactional;

class StuffService {

    static transactional = true;

    @Transactional(readOnly = true)
    def getSomething() {
        def daoFactory = new DaoFactory();
        def stuff = daoFactory.getSomeDao().getSomething();

        return stuff;
    }
}

Обратите внимание, что я статически впрыскиваю Hibernate SessionFactory в свой DaoFactory в файле BootStrap.groovy.

Что еще я могделать неправильно?Спасибо!

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Я вижу, что в руководстве по настройке сказано: «В предыдущем примере конфигурации предполагается, что вам нужна одинаковая конфигурация для всех сред: производства, тестирования, разработки и т. Д.»Но почему бы вам не попробовать сконфигурировать среды, подобные следующим в вашем datasource.grrovy!

environments {
    development {
        dataSource {
            dbCreate = "create-drop" // one of 'create', 'create-drop','update'
            url = "jdbc:hsqldb:mem:devDB"
        }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:hsqldb:mem:testDb"
        }
    }
    production {
        dataSource {
            dbCreate = "update"
            url = "jdbc:hsqldb:file:prodDb;shutdown=true"
        }
    }
}
0 голосов
/ 16 сентября 2011

Я понял это ...

Как вы можете видеть в моем вопросе, я загружал свой конфигурационный файл гибернации, используя следующее:

hibernate {
    config.location = "classpath:some/hibernate/file.cfg.xml"
}

В моем file.cfg.xml,Я определял несколько свойств ... одним из которых было current_session_context_class

<property name="current_session_context_class">thread</property>

Оказывается, когда я делал prod run-app или test run-app, Grails подчинялся тому свойству, которое было в моей конфигурациифайл, но при использовании просто run-app, это не было по какой-то причине.

Итак, если вы столкнулись с этой проблемой, убедитесь, что ваш конфигурационный файл hibernate не имеет настройки, которая может помешать тому, как Grails управляет сессиями Hibernate!

...