迁移后验证GORM模型

时间:2013-04-30 20:09:44

标签: grails gorm database-migration liquibase

我们开始在Grails服务器启动时运行Liquibase迁移。我们想在dataSource上使用dbCreate ='validate',以确保数据库和对象模型保持同步。我们的数据源配置目前如下所示:

development {
    dataSource_dbm {
        dbCreate = ''
        url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;MODE=Oracle"
        username = 'sa'
        password = ''
    }
    dataSource {
        dbCreate = 'validate'
        url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;MODE=Oracle"
        username = 'sa'
        password = ''
    }
}

grails.plugin.databasemigration.dbm.updateOnStart = true
grails.plugin.databasemigration.dbm.updateOnStartFileNames = ['changelog.groovy']

在我们的Config.groovy中。这会导致启动时出现一些错误:

Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'transactionManager': 
Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory';
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'sessionFactory': 
Invocation of init method failed; 
nested exception is org.hibernate.HibernateException: 
Missing table: ...

在运行liquibase迁移之前,好像创建了默认的dataSource并应用了dbCreate策略。

如果我们注释掉第二个dataSource,我们会发现所有迁移确实都是在启动时应用的。

有没有办法配置我们的数据源或databasemigration插件,以便在验证之前运行迁移?或者我们是否必须放弃服务器启动时的验证,并使用带有dbCreate =''的dataSource,并依赖于运行时错误来捕获问题?

1 个答案:

答案 0 :(得分:1)

您可以自己验证架构,就像schema-export脚本允许您捕获Hibernate运行的SQL一样,如果您正在使用“create-drop”。如果你有权访问Spring ApplicationContext(这里我通过依赖注入grailsApplication bean得到它),那么你可以在BootStrap中运行它:

import org.hibernate.tool.hbm2ddl.SchemaValidator

def grailsApplication

....

def ctx = grailsApplication.mainContext
def sessionFactoryFactory = ctx.getBean('&sessionFactory')
def sessionFactory = ctx.getBean('sessionFactory')
def configuration = sessionFactoryFactory.configuration
def settings = sessionFactory.settings

def validator = new SchemaValidator(configuration, settings)
validator.validate()

如果您在http://jira.grails.org/browse/GPDATABASEMIGRATION创建增强请求,这可能是插件的一个很好的补充。我将在即将发布的版本中添加它。