【发布时间】:2018-08-15 08:01:25
【问题描述】:
我构建了一个访问数据库并从中提取数据的 Spring-Boot 应用程序。一切正常,但我想从外部 .properties 文件配置表名。
喜欢:
@Entity
@Table(name = "${fleet.table.name}")
public class Fleet {
...
}
我试图找到一些东西,但我没有。
您可以使用 @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);
}
}
}
}
另外,这个Stackoverflow article over NamingStrategy 给了我这个想法。
【问题讨论】:
-
简单回答你不能,@Value注解只能放在字段、方法和方法/构造函数参数上
-
你是冠军,你的解决方案就像一个魅力,谢谢
-
我想这对我也有帮助..你能告诉我为什么吗:案例“Fleet”,它是你的实体类名吗?我还想从属性文件中获取@Table 名称。
标签: spring spring-data