如何在Grails 5中应用自定义hibernate表命名策略



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

在Grails的早期版本中,这可以通过在hibernate配置中使用"naming_strategy"属性和使用自定义类来实现。有了Hibernate 5,这就不再有效了,任何自定义命名类似乎都被完全忽略了。

我试图通过application.yml、application.groovy甚至环境属性来实例化和设置这样的类,因为所有这些方法都将在纯Spring Boot中工作,然而Grails似乎会覆盖我指定的任何设置。

有没有人面临过同样的问题,并发现了如何实现这一点?

我的自定义类的一个简单示例如下:

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,在每种情况下,创建的表名总是"Customer",而不是我试图实现的"customprefix_Customer"。

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

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

naming_strategy=新的myPackage.MyCustomStrategy('table_prefix'(

这允许在不同的"环境"块中使用不同的表前缀。

这似乎不再被允许,您必须单独指定类名。。。也就是说,这就是现在的工作方式。。。

naming_strategy=myPackage.MyCustomStrategy

然而,使用这种方法,你不能使用构造函数来传递任何值,所以在我的情况下,我在配置中设置了一个额外的变量来声明表前缀,在MyCustomStrategy类中,我读取配置值。

问题已解决。。但是,正如前面提到的,我不确定这种命名策略被否决了多久,Hibernate建议用PhysicalNamingStrategy和ImplicitMingStrategy取代它,希望Grails团队能允许在即将发布的版本中指定这些策略。

最新更新