Java 在Hibernate多租户配置中禁用Spring数据源配置
我正在使用Spring2.x、SpringDataREST、Hibernate5.x和Mysql创建一个服务器REST应用程序 我按照以下准则配置了multitenant:唯一的区别是,我对每个租户使用DB 我有一个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
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中继续使用injectedEntityManager
和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;
}
}