问题描述
我需要添加一些功能和视图,它们是系统架构设计的一部分。这应该是会话启动的一部分(尤其是在开发和测试中),这是因为数据源上的dbCreate create-drop设置使初始开发和测试环境最初设置得一致且原始。
使用数据库迁移插件没有意义,因为这些是预定义的db对象,它们是整个系统设计的一部分,除非它们本身在变化,否则不属于更改集。这等效于要求我们在更改集中添加域表生成sql。如果要更改(这就是更改集的目的!),这是有道理的,但是,如果只是最初创建它,那么从概念上讲,放置它的位置是错误的。
此外,我们不能使用迁移插件,因为我们的生产质量检查流程不允许这种方法(这是一个与项目源无关的外部流程,因此,将变更集保持在多个位置没有意义。项目)。
Hibernate从grails域对象自动生成其架构,我们拥有视图的sql(取决于域对象中的表)以及这些视图中使用的一些函数的sql,我们只需要确定在生成模式时最好在哪里使GORM / Hibernate执行所述sql,以便生成适当的db对象。
在Grails 2.5.5中,我使用了一个自定义的GrailsAnnotationConfiguration来挂接到模式生成过程。在Grails 4+中使用Hibernate 5不再是一种选择。
在不依赖数据库迁移插件的情况下,添加Hibernate Schema生成过程以添加诸如功能和视图之类的自定义db对象的最佳方法是什么?
解决方法
当前(Grails 4.05)的答案似乎是使用数据库迁移插件(如原始问题中所述对我来说不合适)或使用自定义HibernateMappingContextConfiguration以便将自己的休眠“ AuxiliaryDatabaseObject”注入会话工厂通过覆盖buildSessionFactory()方法。这些对象记录在Hibernate文档中,而配置在GORM文档中提到。
所有为辅助数据库对象指定映射的尝试均失败。我无法让Gorm / Grails注意休眠配置和映射文件。目前尚不清楚,或者这是故意的还是错误的。无论如何,我需要一种不同的方法。
幸运的是,HibernateMappingContextConfiguration支持直接添加AuxiliaryDatabaseObject,通过它您可以有效地注入创建或删除辅助db对象(包括函数,视图甚至任意sql)所需的任何SQL。
这对我有用,并且具有以下优点:以这种方式注入的任何代码都可以自然地传递到使用schema-export时生成的ddl,这在数据库管理(包括变更集管理)为外部时必不可少,导出的ddl是产生的工件。
此外,这还可以使您的开发环境使用“ create-drop”作为数据源(因此它总是从原始模式启动)。
例如:
MyHibernateMappingContextConfiguration extends HibernateMappingContextConfiguration {
@Override
SessionFactory buildSessionFactory() throws HibernateException {
//...
//create and add AuxiliaryDatabaseObject instances as needed
super.addAuxiliaryDatabaseObject(myAuxiliaryDatabaseObject)
//...
return super.buildSessionFactory()
}
}
,然后只需将Hibernate配置为通过application.yml使用您的自定义上下文配置:
hibernate:
configClass: path.to.MyHibernateMappingContextConfiguration