Fra*_*e91 5 spring hibernate spring-boot
我添加了一些MetadataBuilderContributor基于数据库(h2、mysql、oracle)的实现,因为它们的语法略有不同。
截至目前,贡献者的注册通过以下位置的财产进行application.yml:
spring:
jpa:
properties:
hibernate:
metadata_builder_contributor: org.foo.bar.H2Implementation
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建多个配置文件 -h2、-mysql、-oracle 来应用正确的贡献者。但是,我想根据driverClassName设置自动设置这些(如果我能找到匹配项,否则默认为 application.yml)
有没有办法做到这一点而不需要在我的 application.yml 中输入?
小智 2
这是 Frame91 提到的我的解决方案,使用 SpringApplicationEnvironmentPreparedEvent
public class MetadataBuilderContributerResolver
implements ApplicationListener<ApplicationEnvironmentPreparedEvent>
{
@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
ConfigurableEnvironment environment = event.getEnvironment();
String driverClassName = environment.getProperty("spring.datasource.driverClassName");
Class<?> metadataBuilderContributorClazz = switch (driverClassName) {
case "org.h2.Driver" -> H2MetadataBuilderContributor.class;
case "org.mariadb.jdbc.Driver" -> MariaDbMetadataBuilderContributor.class;
case "oracle.jdbc.OracleDriver" -> OracleMetadataBuilderContributor.class;
default -> throw new IllegalArgumentException("Unsupported driver: " + driverClassName);
};
String className = metadataBuilderContributorClazz.getName();
Properties props = new Properties();
props.put("spring.jpa.properties.hibernate.metadata_builder_contributor", className);
environment.getPropertySources().addFirst(new PropertiesPropertySource(this.getClass().getName(), props));
}
}
Run Code Online (Sandbox Code Playgroud)
感谢 Frame91
| 归档时间: |
|
| 查看次数: |
765 次 |
| 最近记录: |