Java 在Hibernate多租户配置中禁用Spring数据源配置

Java 在Hibernate多租户配置中禁用Spring数据源配置,java,spring,hibernate,spring-boot,Java,Spring,Hibernate,Spring Boot,我正在使用Spring2.x、SpringDataREST、Hibernate5.x和Mysql创建一个服务器REST应用程序 我按照以下准则配置了multitenant:唯一的区别是,我对每个租户使用DB 我有一个multi-tenantconnectionprovider来创建到数据库的连接,还有一个TenantIdentifierResolver来获取当前租户 一些相关代码: @Component public class TenantIdentifierResolver impleme

我正在使用Spring2.x、SpringDataREST、Hibernate5.x和Mysql创建一个服务器REST应用程序

我按照以下准则配置了multitenant:唯一的区别是,我对每个租户使用DB

我有一个
multi-tenantconnectionprovider
来创建到数据库的连接,还有一个
TenantIdentifierResolver
来获取当前租户

一些相关代码:

@Component

public class TenantIdentifierResolver implements CurrentTenantIdentifierResolver {

    @Override

    public String resolveCurrentTenantIdentifier() {

        String tenantId = TenantContext.getCurrentTenant();

        if (tenantId != null) {

            return tenantId;

        }

        return DEFAULT_TENANT_ID;

    }

    @Override

    public boolean validateExistingCurrentSessions() {

        return true;

    }

}

在应用程序启动过程中,我看到Spring创建了一个到属性文件中配置的db的连接池

我希望避免这种情况,因为我的所有连接都是由
MultiTenantConnectionProviderImpl
创建的。 我想在我的bean中继续使用injected
EntityManager
Datasource
功能

我已经看到了如何禁用SpringBoot数据源配置,但这样做之后,我就不能再在应用程序中注入数据源了


对于如何从属性文件中完全删除数据源的定义,并从
MultiTenantConnectionProviderImpl
以编程方式将数据源注入应用程序,您有什么建议吗?

以下是一个完整的示例,介绍如何以编程方式创建数据源

仅参数取自属性文件,而不是java类内部的硬编码

当您定义多个数据源时,您必须定义一个
@Primary
和一个,然后您将有一个
@Qualifier
,它标识每个数据源。如何管理它们应该很简单

@RequiredArgsConstructor
@PropertySource({"classpath:persistence/persistence-primarydb.properties"})
@EnableJpaRepositories(basePackages = "io.vforge.cauldron.repository.primary",
        entityManagerFactoryRef = "primaryEntityManagerFactory",
        transactionManagerRef = "primaryTransactionManager")
@EnableJpaAuditing
@Configuration
public class CauldronPrimaryDatasource {

    private final Environment env;

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(primaryDataSource());
        em.setPackagesToScan("io.vforge.cauldron.model.primary");

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("primary.hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect", env.getProperty("primary.hibernate.dialect"));
        properties.put("hibernate.show_sql", env.getProperty("primary.hibernate.show_sql"));
        em.setJpaPropertyMap(properties);

        return em;
    }

    @Primary
    @Bean
    public HikariDataSource primaryDataSource() {
        final HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(env.getProperty("primary.datasource.url"));
        dataSource.setUsername(env.getProperty("primary.datasource.username"));
        dataSource.setPassword(env.getProperty("primary.datasource.password"));
        return dataSource;
    }

    @Primary
    @Bean
    public PlatformTransactionManager primaryTransactionManager() {
        JpaTransactionManager transactionManager= new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
                primaryEntityManagerFactory().getObject());
        return transactionManager;
    }

}
@RequiredArgsConstructor
@PropertySource({“classpath:persistence/persistence primarydb.properties”})
@EnableJpaRepositories(basePackages=“io.vforge.cauldron.repository.primary”,
entityManagerFactoryRef=“primaryEntityManagerFactory”,
transactionManagerRef=“primaryTransactionManager”)
@启用JPA审核
@配置
公共类CauldronPrimaryDatasource{
私人最终环境保护;
@初级的
@豆子
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(){
LocalContainerEntityManagerFactoryBean em
=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan(“io.vforge.cauldron.model.primary”);
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
HashMap属性=新建HashMap();
properties.put(“hibernate.hbm2ddl.auto”,env.getProperty(“primary.hibernate.hbm2ddl.auto”);
properties.put(“hibernate.dial”,env.getProperty(“primary.hibernate.dial”);
properties.put(“hibernate.show_sql”,env.getProperty(“primary.hibernate.show_sql”);
em.setJpaPropertyMap(属性);
返回em;
}
@初级的
@豆子
公共HikariDataSource primaryDataSource(){
最终HikariDataSource数据源=新的HikariDataSource();
setJdbcUrl(env.getProperty(“primary.dataSource.url”);
setUsername(env.getProperty(“primary.dataSource.username”);
setPassword(env.getProperty(“primary.dataSource.password”);
返回数据源;
}
@初级的
@豆子
公共平台TransactionManager primaryTransactionManager(){
JpaTransactionManager transactionManager=新的JpaTransactionManager();
transactionManager.setEntityManagerFactory(
primaryEntityManagerFactory().getObject());
返回事务管理器;
}
}
@Configuration
@Profile("prod")
public class HibernateConfig {

    @Autowired
    private JpaProperties jpaProperties;

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        return new HibernateJpaVendorAdapter();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource,
            MultiTenantConnectionProvider multiTenantConnectionProviderImpl,
            CurrentTenantIdentifierResolver currentTenantIdentifierResolverImpl) {
        Map<String, Object> properties = new HashMap<>();
        properties.putAll(jpaProperties.getHibernateProperties(new HibernateSettings()));
        properties.put(Environment.MULTI_TENANT, MultiTenancyStrategy.DATABASE);
        properties.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProviderImpl);
        properties.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolverImpl);
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan("com.server");
        em.setJpaVendorAdapter(jpaVendorAdapter());
        em.setJpaPropertyMap(properties);

        return em;
    }

}
spring.datasource.url=jdbc:mysql://url:3306/empty?useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false
spring.datasource.username=empty
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.password=empty
  spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.hibernate.ddl-auto: validate
spring.jpa.hibernate.naming.physical-   strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.show-sql: false
@RequiredArgsConstructor
@PropertySource({"classpath:persistence/persistence-primarydb.properties"})
@EnableJpaRepositories(basePackages = "io.vforge.cauldron.repository.primary",
        entityManagerFactoryRef = "primaryEntityManagerFactory",
        transactionManagerRef = "primaryTransactionManager")
@EnableJpaAuditing
@Configuration
public class CauldronPrimaryDatasource {

    private final Environment env;

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(primaryDataSource());
        em.setPackagesToScan("io.vforge.cauldron.model.primary");

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("primary.hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect", env.getProperty("primary.hibernate.dialect"));
        properties.put("hibernate.show_sql", env.getProperty("primary.hibernate.show_sql"));
        em.setJpaPropertyMap(properties);

        return em;
    }

    @Primary
    @Bean
    public HikariDataSource primaryDataSource() {
        final HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(env.getProperty("primary.datasource.url"));
        dataSource.setUsername(env.getProperty("primary.datasource.username"));
        dataSource.setPassword(env.getProperty("primary.datasource.password"));
        return dataSource;
    }

    @Primary
    @Bean
    public PlatformTransactionManager primaryTransactionManager() {
        JpaTransactionManager transactionManager= new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
                primaryEntityManagerFactory().getObject());
        return transactionManager;
    }

}