在迁移后验证GORM模型



我们开始在Grails服务器启动上运行Liquibase迁移。我们希望在数据源上使用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: ...

看起来好像在运行迁移之前创建了默认数据源并应用了dbCreate策略。

如果我们注释掉第二个数据源,我们会看到所有的迁移确实在启动时应用。

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

您可以自己验证模式,就像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上创建一个增强请求,我会考虑在即将发布的版本中添加它。

相关内容

  • 没有找到相关文章

最新更新