【问题标题】:Table name configured with external properties file使用外部属性文件配置的表名
【发布时间】: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


【解决方案1】:

表名实际上来自 hibernate 本身通过其策略接口。 Boot 将其配置为SpringNamingStrategy,并且在 Boot 2.x 中有一些更改可以自定义。值得一读 gh-1525 进行这些更改的地方。 Configure Hibernate Naming Strategy 有更多信息。

有一些想法可以添加一些自定义属性来配置 SpringNamingStrategy,但我们允许更轻松地自定义整个策略 bean,因为这允许用户做他们需要做的任何事情。

AFAIK,没有像您问的那样直接进行配置的方法,但我假设如果您创建自己的策略,然后可以将您自己的属性自动连接到那里。在那些自定义策略界面中,您将看到实体名称,您可以在引导的配置属性中为此保留一个键空间并匹配实体名称。

mytables.naming.fleet.name=foobar
mytables.naming.othertable.name=xxx

您的配置属性将采用mytables,其中naming 将是Map。然后在您的自定义策略中,只需从映射表中检查您是否定义了自定义名称。

【讨论】:

    【解决方案2】:

    Spring boot 解决方案: 创建下面的类

    @Configuration
    public class CustomPhysicalNamingStrategy extends SpringPhysicalNamingStrategy{
    
    @Value("${table.name}")
    private String tableName;
    
    @Override
    public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return Identifier.toIdentifier(tableName);
    }
    

    }

    将以下属性添加到 application.properties:

    spring.jpa.properties.hibernate.physical_naming_strategy=<package.name>.CustomPhysicalNamingStrategy
    table.name=product
    

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多