我得到了一个要求,其中每个公司都有相同的模式单独的数据库,在未来新的公司可能会添加到相同的模式结构。我必须连接他们的公司模式基于用户登录。因此,每次用户登录时,我都必须连接不同数据库。我想使用spring data JPA来处理connection.Only,我将在属性file.Is中配置新的模式凭据,这样我们就可以添加使用相同模型classes.All的动态数据库模式,这应该只在运行时发生。
发布于 2016-06-23 20:04:29
听起来你在问关于多租户支持的问题。您可以创建如下所示的LocalContainerEntityManagerFactoryBean:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource,
MultiTenantConnectionProvider multiTenantConnectionProvider,
CurrentTenantIdentifierResolver tenantIdentifierResolver) {
LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean();
emfBean.setDataSource(dataSource);
emfBean.setPackagesToScan(Application.class.getPackage().getName());
emfBean.setJpaVendorAdapter(jpaVendorAdapter());
Map<String, Object> jpaProperties = new HashMap<>();
jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
// Improved naming strategy deprecated as of hibernate 5.0
// jpaProperties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
jpaProperties.put("hibernate.implicit_naming_strategy", "org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl");
jpaProperties.put("hibernate.physical_naming_strategy", "com.example.config.HibernateLegacyImprovedNamingStrategy");
jpaProperties.put("hibernate.show_sql", "true");
jpaProperties.put("hibernate.format_sql", "true");
jpaProperties.put(org.hibernate.cfg.Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
jpaProperties.put(org.hibernate.cfg.Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
jpaProperties.put(org.hibernate.cfg.Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, tenantIdentifierResolver);
emfBean.setJpaPropertyMap(jpaProperties);
return emfBean;
}并提供了MultiTenantConnectionProvider和CurrentTenantIdentifierResolver的实现
例如,对于模式租用,CurrentTenantIdentifierResolver可以从会话中查找当前用户,以确定要使用哪种模式。
在返回连接以供使用之前,MultiTenantConnectionProvider可以使用SELECT set_schema_to(?)之类的命令更改连接(并在返回时重置连接)。
@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
final Connection connection = getAnyConnection();
setSchemaTo(connection, tenantIdentifier);
return connection;
}您需要阅读有关多租户的知识,了解您想要的类型以及您正在使用的实现。
https://stackoverflow.com/questions/37990510
复制相似问题