Spring Boot中根据数据库类型注册MetadataBuilderContributor

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