我想在Spring Boot应用中设置hibernate.format_sql
。我想使用环境变量来设置它。
Spring Boot相当轻松地将所有环境变量从例如FOO_BAR_BAZ
转换为Spring上下文中名为foo.bar.baz
的属性。
如何使用环境变量在Spring Boot中设置目标名称中包含下划线的属性?大概HIBERNATE_FORMAT_SQL
将被翻译为hibernate.format.sql
?
答案 0 :(得分:21)
这是一个老问题,但我会回答它,以防其他人(像我一样)最终在这里寻找这些信息。
HIBERNATE_FORMAT_SQL应该做的伎俩
实际上,它不是“翻译”的OS环境变量,而是Spring属性名称。
该名称以多种方式翻译,并针对可用的环境变量进行查找。例如。 “hibernate.format.sql”被查找为:
然后与大写相同:
虽然您无法使用set或export命令在名称中设置带点的环境变量,但可以使用env命令。我推迟判断这是否是个好主意:
env "my.dotted.name=\"a value\"" the-command-you-want-to-run
看看SystemEnvironmentPropertySource.java 详情。我链接到特定版本,但您应该确保查看您正在使用的版本。
要解决生产环境中的这些问题,您可以尝试为属性解析代码启用调试日志记录:
logging:
level:
org.springframework.core.env: DEBUG
...或者通过设置适当的环境变量:)
答案 1 :(得分:0)
结果SPRING_JPA_SHOW_SQL=true
工作得很好。我不知道这是否意味着该特定属性的名称被重载,或者Spring是否正在做一些更聪明的事情。它解决了我的问题,并为我所问的例子提供了所需的行为。
答案 2 :(得分:0)
我遇到了同样的问题,环境变量 spring_jpa_properties_hibernate_default_schema
Spring 翻译为 spring.jpa.properties.hibernate.default.schema
,但 Hibernate 需要 hibernate.default_schema
。
出于某些原因(devops 问题),我无法将其更改为 spring.jpa.properties.hibernate.default_schema
- 它可以在本地机器上运行。
我是这样解决的
@Component
public class HibernateConfig implements HibernatePropertiesCustomizer {
private final static String HIBERNATE_CUSTOM_DEFAULT_SCHEMA_PARAM = "hibernate.default.schema";
@Override
public void customize(Map<String, Object> hibernateProperties) {
if (hibernateProperties.containsKey(HIBERNATE_CUSTOM_DEFAULT_SCHEMA_PARAM)) {
hibernateProperties.put(AvailableSettings.DEFAULT_SCHEMA, hibernateProperties.get(HIBERNATE_CUSTOM_DEFAULT_SCHEMA_PARAM));
}
}
}