如何在使用Grails 4.0.5Hibernate 5生成架构的过程中添加自定义db对象,而无需迁移插件?

问题描述

我需要添加一些功能和视图,它们是系统架构设计的一部分。这应该是会话启动的一部分(尤其是在开发和测试中),这是因为数据源上的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  

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...