我构建了一个访问数据库并从中提取数据的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文章给了我一个想法。
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
表名实际上来自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网址。(不是通过管理控制台)。有一些限制,我不必使用管理控制台。我想通过命令提示符来更改它。我已经谷歌了这个,但在任何地方都找不到这个信息。 谢谢你的帮助。