首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring data jpa (hibernate+spring+jpa)

spring data jpa (hibernate+spring+jpa)
EN

Stack Overflow用户
提问于 2016-06-23 19:36:09
回答 1查看 107关注 0票数 0

我得到了一个要求,其中每个公司都有相同的模式单独的数据库,在未来新的公司可能会添加到相同的模式结构。我必须连接他们的公司模式基于用户登录。因此,每次用户登录时,我都必须连接不同数据库。我想使用spring data JPA来处理connection.Only,我将在属性file.Is中配置新的模式凭据,这样我们就可以添加使用相同模型classes.All的动态数据库模式,这应该只在运行时发生。

EN

回答 1

Stack Overflow用户

发布于 2016-06-23 20:04:29

听起来你在问关于多租户支持的问题。您可以创建如下所示的LocalContainerEntityManagerFactoryBean

代码语言:javascript
复制
@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;
}

并提供了MultiTenantConnectionProviderCurrentTenantIdentifierResolver的实现

例如,对于模式租用,CurrentTenantIdentifierResolver可以从会话中查找当前用户,以确定要使用哪种模式。

在返回连接以供使用之前,MultiTenantConnectionProvider可以使用SELECT set_schema_to(?)之类的命令更改连接(并在返回时重置连接)。

代码语言:javascript
复制
@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
    final Connection connection = getAnyConnection();
    setSchemaTo(connection, tenantIdentifier);
    return connection;
}

您需要阅读有关多租户的知识,了解您想要的类型以及您正在使用的实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37990510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档