如何在 Grails 5 中应用自定义休眠 table 命名策略

How can I apply a custom hibernate table naming strategy in Grails 5

我需要将 table 前缀应用于 Gorm/Hibernate 创建的所有数据库 table。

在以前的 Grails 版本中,这可以通过在休眠配置中使用 'naming_strategy' 属性 和使用自定义 class 来实现。对于 Hibernate5,这不再有效,任何自定义命名 class 似乎都被完全忽略了。

我试图通过 application.yml、application.groovy 实例化和设置这样的 classes,甚至是环境属性,因为所有这些方法都可以在纯 Spring 引导中工作,但是 Grails 似乎覆盖了我指定的任何设置。

有没有人遇到同样的问题并发现了如何实现这一点?

我自定义的一个简单例子class如下:

class CustomNamingStrategy extends PhysicalNamingStrategyStandardImpl  {

  @Override
  Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
    return "customprefix_" + name
  }

}

以及指定命名策略的例子:

spring:
  jpa:
    properties:
      hibernate:
        physical_naming_strategy: tableprefix.CustomNamingStrategy
    hibernate:
      naming:
        physical-strategy: tableprefix.CustomNamingStrategy
        physical_naming_strategy: tableprefix.CustomNamingStrategy
hibernate:
  physical_naming_strategy: tableprefix.CustomNamingStrategy

我有一个域,Customer,在每种情况下,创建的 table 名称始终是 'customer',而不是 'customprefix_customer',这正是我试图实现的。

在我的特定情况下,答案是自定义策略 class 的声明方式。

在 v2 中,在 config.groovy 中,命名策略是实例化一个新的 class,利用它的构造函数,即

naming_strategy = 新 myPackage.MyCustomStrategy('table_prefix')

这允许在不同的 'environment' 块中使用不同的 table 前缀。

这似乎不再被允许,您必须单独指定 class 名称...即现在可以使用...

naming_strategy = myPackage.MyCustomStrategy

然而,使用这种方法,您不能使用构造函数传入任何值,因此在我的例子中,我在配置中设置了一个附加变量来声明 table 前缀,并且在MyCustomStrategy class,我正在读取配置值。

问题已解决..但是如前所述,我不确定多长时间,这个 naming_strategy 策略已被弃用,Hibernate 建议它应该被 PhysicalNamingStrategy 和 ImplicitNamingStrategy 取代,希望 Grails 团队允许这些将在即将发布的版本中指定。