Grails 迁移后验证GORM模型

Grails 迁移后验证GORM模型,grails,gorm,database-migration,liquibase,Grails,Gorm,Database Migration,Liquibase,我们开始在Grails服务器启动时运行Liquibase迁移。我们希望在数据源上使用dbCreate='validate',以确保数据库和对象模型保持同步。我们的数据源配置当前如下所示: development { dataSource_dbm { dbCreate = '' url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;MODE=Oracle" username = 'sa'

我们开始在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 = ''
    }
}

在我们的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迁移之前创建了默认数据源并应用了dbCreate策略

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


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

您可以自己验证模式,就像
模式导出
脚本允许您捕获Hibernate在使用“create drop”时运行的SQL一样。如果您有权访问Spring
ApplicationContext
(这里我是通过注入
grailsApplication
bean的依赖项来获得它的),那么您可以在引导中运行它:

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://grails.org/doc/latest/guide/single.html#dataSource)
建议在您开始使用插件或Liquibase并且拥有相对稳定的模式时,不要使用
dbCreate
。相反,我们在插件中有
before
after
回调,用于
数据库
而不是
数据源
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()