如何在 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 团队允许这些将在即将发布的版本中指定。
我需要将 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 团队允许这些将在即将发布的版本中指定。