当前位置: 首页 > 知识库问答 >
问题:

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

洪伟兆
2023-03-14

我构建了一个访问数据库并从中提取数据的Spring-Boot应用程序。一切正常,但我想从外部. Properties文件配置表名。

比如:

@Entity
@Table(name = "${fleet.table.name}")
public class Fleet {
...
}

我想找点东西,但没找到。

您可以使用@Value("...")注释访问外部属性。

所以我的问题是:有没有办法配置表名?或者我可以更改/拦截hibernate发送的查询吗?

解决方案:

好的,hibernate 5适用于物理命名策略。所以我创建了自己的物理命名策略

@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);
        }
    }
}
}

此外,这篇关于NamingStrategy的Stackoverflow文章给了我一个想法。

共有2个答案

尹昂雄
2023-03-14

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);
}

}

将下面的属性添加到应用程序中。属性:

spring.jpa.properties.hibernate.physical_naming_strategy=<package.name>.CustomPhysicalNamingStrategy
table.name=product
燕和同
2023-03-14

表名实际上来自hibernate本身,通过它的策略接口。Boot将其配置为SpringNamingStrategy,Boot 2中有一些更改。x如何定制物品。值得一读的是gh-1525,在那里进行了这些更改。配置Hibernate命名策略有更多信息。

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

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

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

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

 类似资料:
  • 我希望在运行时传递变量,一旦war文件部署在tomcat上。如何使用classplath中的application.properties以及另一个属性文件ex。abcd.properties位于specific directory.am基本上希望设置额外的类路径,并从该路径中的属性文件中读取值,以及war部署的默认类路径位置。 我使用Spring boot。其中一种方法是将所有属性传递到数据库端,

  • 我试图实现的是在application.yml文件上指定一个目录,该目录直接位于类路径上(在/resources下)。我希望能有这样的东西: 使用这种方法,IDE将始终默认为application-dev.yml。当我通过gradle构建应用程序,并在传递命令行参数的同时运行它时,我可以指定配置文件,从而加载适当的文件。理想情况下,能够做到这一点: java-jar-dspring.profile

  • 我想在spring Boot中设置3个配置文件:production,development,test,使用外部配置文件。 应用程序类: AppConfig类:

  • 上一个示例仅展示了java硬编码式的配置,更多的应用场景是使用外部配置文件,灵活配置调度策略,以便于随时改变调度策略,如下是外部配置的代码示例: cron4j=task1, task2 task1.cron=* * * * * task1.class=com.xxx.TaskAaa task1.daemon=true task1.enable=true task2.cron=* * * * *

  • 我想将@EnableJPARepositories基本包的配置外部化。 我有两个不同的样品包如下 com。项目道博士 我尝试了下面的属性外部化(不适用于多个包) ProjectConfig.class 配置。性质 对于多个包,是否有其他方法将此配置外部化? 谢谢

  • 任何人都知道哪个属性文件或配置文件存储了weblogic 12c服务器的T3网址。我必须通过配置/属性文件通过登录服务器来编辑/更改T3网址。(不是通过管理控制台)。有一些限制,我不必使用管理控制台。我想通过命令提示符来更改它。我已经谷歌了这个,但在任何地方都找不到这个信息。 谢谢你的帮助。