Grails 迁移后验证GORM模型
我们开始在Grails服务器启动时运行Liquibase迁移。我们希望在数据源上使用dbCreate='validate',以确保数据库和对象模型保持同步。我们的数据源配置当前如下所示: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'
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一样。如果您有权访问SpringApplicationContext
(这里我是通过注入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()