我正在使用 Grails 3.3 应用程序,该应用程序在后台使用 GORM 6.1.6.RELEASE
、Spring-Boot1.5.4.RELEASE
和 Spring Core 。4.3.9.RELEASE
我试图声明一个在 Hibernate 开始验证底层数据库模式之前被初始化的 Spring bean。
这是我喜欢做的事情。我想将我的 Flyway 注册为 Spring bean 并将dataSource
bean 注入其中。为了在 Hibernate 开始验证当前数据库模式之前运行 Flyway,我将我的flyway
bean 作为依赖项添加到sessionFactory
bean 上。顺序如下:
dataSource
豆flyway
豆hiberateDatastore
豆
GORM 6.1 使用org.grails.orm.hibernate.HibernateDatastore
Spring bean 来初始化 Hibernate ORM 和数据库。sessionFactory
bean 声明hibernateDatastore#getSessionFactory
为工厂类。因此,hibernateDatastore
总是首先创建。
在 Grails 3.3 中创建自定义 Spring bean 的方法是什么,该 bean 必须在与数据库的连接可用但在 Hibernate 内容被初始化之前运行?
resources.groovy
在以前的 Grails 3.x 版本中,可以像这样声明它。
beans = {
if (Environment.current == Environment.PRODUCTION) {
flyway(Flyway) { bean ->
bean.initMethod = 'migrate'
dataSource = ref('dataSource')
locations = 'classpath:db/h2'
baselineOnMigrate = true
}
BeanDefinition sessionFactoryBeanDef = getBeanDefinition('hibernateDatastore')
if (sessionFactoryBeanDef) {
def dependsOnList = ['flyway'] as Set
if (sessionFactoryBeanDef.dependsOn?.length > 0) {
dependsOnList.addAll(sessionFactoryBeanDef.dependsOn)
}
sessionFactoryBeanDef.dependsOn = dependsOnList as String[]
}
}
}