DK1*_*990 12 spring spring-data
我构建了一个访问数据库并从中提取数据的 Spring-Boot 应用程序。一切正常,但我想从外部 .properties 文件配置表名。
喜欢:
@Entity
@Table(name = "${fleet.table.name}")
public class Fleet {
...
}
Run Code Online (Sandbox Code Playgroud)
我试图找到一些东西,但我没有。
您可以使用@Value("...")注释访问外部属性。
所以我的问题是:有什么办法可以配置表名?或者我可以更改/拦截休眠发送的查询吗?
解决方案:
好的,hibernate 5 与PhysicalNamingStrategy. 所以我创建了自己的PhysicalNamingStrategy.
@Configuration
public class TableNameConfig{
@Value("${fleet.table.name}")
private String fleetTableName;
@Value("${visits.table.name}")
private String visitsTableName;
@Value("${route.table.name}")
private String routeTableName;
@Bean
public PhysicalNamingStrategyStandardImpl physicalNamingStrategyStandard(){
return new PhysicalNamingImpl();
}
class PhysicalNamingImpl extends PhysicalNamingStrategyStandardImpl {
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
switch (name.getText()) {
case "Fleet":
return new Identifier(fleetTableName, name.isQuoted());
case "Visits":
return new Identifier(visitsTableName, name.isQuoted());
case "Result":
return new Identifier(routeTableName, name.isQuoted());
default:
return super.toPhysicalTableName(name, context);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
另外,这篇关于 NamingStrategy 的 Stackoverflow 文章给了我这个想法。
表名实际上来自 hibernate 本身通过其策略接口。Boot 将其配置为,SpringNamingStrategy并且 Boot 2.x 中的定制方式发生了一些变化。值得阅读gh-1525,其中进行了这些更改。配置 Hibernate 命名策略有更多信息。
有一些想法可以添加一些自定义属性来配置SpringNamingStrategy,但我们选择允许更轻松地自定义整个策略 bean,因为这允许用户执行他们需要执行的任何操作。
AFAIK,没有像您要求的那样直接进行配置的方法,但我假设如果您创建自己的策略,您可以将自己的属性自动连接到那里。正如在那些自定义策略界面中一样,您将看到实体名称,您可以在引导的配置属性中为此保留一个键空间并匹配实体名称。
mytables.naming.fleet.name=foobar
mytables.naming.othertable.name=xxx
Run Code Online (Sandbox Code Playgroud)
您的配置属性将mytables包含naming一个Map. 然后,在您的自定义策略中,只需从映射表中检查您是否定义了自定义名称即可。
| 归档时间: |
|
| 查看次数: |
6160 次 |
| 最近记录: |