我们开始在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上创建一个增强请求,我会考虑在即将发布的版本中添加它。