Grails加载属性文件并同时使用dbCreate =“create-drop”

时间:2013-04-17 15:38:45

标签: hibernate grails properties

我在环境配置方面遇到了一些麻烦。对于某些测试,我们需要一个真正的数据库来进行集成测试。为了在每次开始测试时都有一个干净的数据库,我们认为我们只是更改已加载的配置文件中的dbCreate属性:

config-integration.properties:

# connection
db.name=integration_test
db.host=127.0.0.1
db.port=3306
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?useUnicode=yes&characterEncoding=UTF-8&autoReconnect=true
dataSource.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

# configuration
dataSource.username=foo
dataSource.password=bar
dataSource.dbCreate=create-drop
dataSource.pooled=true
dataSource.properties.maxActive=50
dataSource.properties.maxIdle=25
dataSource.properties.minIdle=5
dataSource.properties.initialSize=5
dataSource.properties.minEvictableIdleTimeMillis=60000
dataSource.properties.timeBetweenEvictionRunsMillis=60000
dataSource.properties.maxWait=10000
dataSource.properties.validationQuery=/* ping */

Config.groovy中:

environment {
....
integration {
    log4j = {
        root { debug 'stdout' }
        warn 'org.apache'
        warn 'grails.spring'
        info 'org.codehaus.groovy.grails'
        warn 'net.sf.ehcache'
        warn 'org.hibernate'
    }

    grails.serverURL = "http://www.foobar.com"

    if (!grails.config.locations || !(grails.config.locations instanceof List)) {
        grails.config.locations = []
    }
    // loading default configuration
    grails.config.locations << "classpath:app/config-integration.properties"

    grails.gorm.failOnError = true
}
....
}

现在的问题是,这根本不起作用。这些表未创建,因此测试会因SQL异常而死亡。如果我将其更改为错误的用户名/密码,则甚至没有消息。因此,当grails / hibernate在数据库中创建表时,看起来似乎没有加载配置。

编辑:我忘了:如果我在Config.groovy本身定义dataSource,它就可以了。

有没有人知道我在这里做错了什么?

提前多多感谢!

2 个答案:

答案 0 :(得分:0)

这可能是我正在寻找的一个蹩脚的澄清,但你在使用

environment{
  test{
   ....
  }
}

environment{
  integration{
   ....
  }
}

配置文件中的DSL?

如果我没有弄错的话,我们只提供developmenttestproduction个环境DSL。

答案 1 :(得分:0)

所以,我无法弄清楚为什么,但它看起来像桌子掉落&amp;在实际启动grails应用程序并加载配置之前,Hibernate完成创建工作。因此,我现在使用不同的方法并“手动”加载配置并设置属性。现在看起来像这样,工作正常:

integration {
    log4j = {
        root { debug 'stdout' }
        warn 'org.apache'
        warn 'grails.spring'
        info 'org.codehaus.groovy.grails'
        warn 'net.sf.ehcache'
        warn 'org.hibernate'
    }

    def props = new Properties()

    new File("grails-app/conf/app/appconfig-integration-tests.properties").withInputStream {
        stream -> props.load(stream)
    }

    def user_file = new File("grails-app/conf/app/appconfig-${System.getProperty("user.name")}.properties")
    if(user_file.exists()) {
        user_file.withInputStream {
            stream -> props.load(stream)
        }
    }

    dataSource {
        username = props.get("dataSource.username")
        password = props.get("dataSource.password")
        dbCreate = props.get("dataSource.dbCreate")
        driverClassName = props.get("dataSource.driverClassName")
        dialect = props.get("dataSource.dialect")
        url = props.get("dataSource.url")
    }

    grails.serverURL = "http://www.foobar.com"

    grails.gorm.failOnError = true
}