如何在不需要迁移插件的情况下使用 Grails 4.0.5 (Hibernate 5) 在模式生成期间添加自定义数据库对象?

How can I add custom db objects during schema generation with Grails 4.0.5 (Hibernate 5) without the need for migration plugin?

我需要添加一些功能和视图,它们是系统架构设计的一部分。这应该是会话启动的一部分(尤其是在开发和测试中),因为数据源上的 dbCreate create-drop 设置使得初始开发和测试环境最初设置一致且原始。

使用数据库迁移插件没有意义,因为这些是预定义的数据库对象,是整个系统设计的一部分,不属于更改集,除非它们本身正在更改。相当于要求我们在一个变更集中添加域table代sql。如果它正在更改(这就是更改集的用途!),这是有道理的,但如果它只是最初创建的,那么从概念上讲,放置它的位置是错误的。

此外,我们不能使用迁移插件,因为我们的生产 QA 流程不允许这种方法(这是一个与项目源无关的外部流程,因此维护更改集没有意义在多个项目中)。

Hibernate 从 grails 域对象自动生成它的模式,我们有视图的 sql(取决于来自域对象的 tables)以及 sql 对于这些视图中使用的一些函数,我们只需要确定在哪里最好让 GORM / Hibernate 执行所述 sql 以便在生成模式时生成适当的数据库对象。

在 Grails 2.5.5 中,我使用了自定义 GrailsAnnotationConfiguration 来连接模式生成过程。这不再是在 grails 4+ 中使用 Hibernate 5 的选项。

为了在不依赖数据库迁移插件的情况下添加函数和视图等自定义数据库对象,绑定到 Hibernate Schema 生成过程的最佳方法是什么?

目前(Grails 4.05)答案似乎是使用数据库迁移插件(如原始问题中所述,这对我来说不合适)或使用自定义 HibernateMappingContextConfiguration 以注入您自己的休眠 'AuxiliaryDatabaseObject'通过覆盖 buildSessionFactory() 方法进入会话工厂。这些对象记录在 Hibernate 文档中,配置在 GORM 文档中提到。

为辅助数据库对象指定映射的所有尝试都失败了。我无法让 Gorm / Grails 关注休眠配置和映射文件。目前尚不清楚,或者这是故意的还是错误。无论如何,我需要一种不同的方法。

幸运的是,HibernateMappingContextConfiguration 支持直接添加 AuxiliaryDatabaseObject,通过它您可以有效地注入创建或删除辅助数据库对象所需的任何 SQL,包括函数、视图,甚至任意 sql。

这对我有用,优点是任何以这种方式注入的代码都会(自然地)传递到使用模式导出时生成的 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() 
  }
}

然后通过 application.yml:

配置休眠以使用您的自定义上下文配置
hibernate:
    configClass: path.to.MyHibernateMappingContextConfiguration