使用外部属性文件配置的表名

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 文章给了我这个想法。

Jan*_*hti 6

表名实际上来自 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. 然后,在您的自定义策略中,只需从映射表中检查您是否定义了自定义名称即可。