spring mvc hibernate创建和操作几个数据库的sessionfactorys

时间:2013-05-27 08:12:46

标签: hibernate java-ee spring-mvc multiple-databases sessionfactory

这里我有一个问题,我想在这里找到一个解决方案,我在项目中使用spring mvc和hibernate工作我有几个具有相同架构的数据库(按公司数据库)和一个用于身份验证的数据库,当用户登录我必须生成一个与用户公司数据库对应的SessionFactory,你可以通过向我提供一个架构来帮助我,请给我一些例子,对不起我的英语。

1 个答案:

答案 0 :(得分:1)

根据您使用的hibernate版本,您可以使用hibernate的内置多租户功能。为此,您需要按照此文档this documentation

实施CurrentaTenantIdentifierResolverMultiTenantConnectionProvider

必须另外设置以下hibernateProperties才能使用它们:

                hibernate.multiTenancy=DATABASE
                hibernate.tenant_identifier_resolver=xxx.xxx.CurrentTenantIdentifierResolverImpl
                hibernate.multi_tenant_connection_provider=xxx.xxx.MultiTenantConnectionProviderImpl

示例实施: CurrentTenantIdentifier:

import javax.faces.context.FacesContext;

import org.hibernate.context.spi.CurrentTenantIdentifierResolver;

public class CurrentTenantIdentifierResolverImpl implements CurrentTenantIdentifierResolver {



    @Override
        public String resolveCurrentTenantIdentifier() {
            if (SecurityContextHolder.getContext().getAuthentication().getPrincipal().yourOwnRoutineToDetermineCompanyxxx=="companyxxx"){
                return "companyxxx";

            } else  if ... furhter companies{
                ...
            }
        }

        @Override
        public boolean validateExistingCurrentSessions() {
            return true;
        }

    }

MultiTenantConnectionProvider:

public class MultiTenantConnectionProviderImpl extends AbstractMultiTenantConnectionProvider {
    @Autowired
    private DataSoruce DScompany02;
    @Autowired
    private DataSource DScompany01;
    @Autowired
    private DataSource default;

    @Override
    protected ConnectionProvider getAnyConnectionProvider() {
        return new DatasourceConnectionProvider(default);
    }

    @Override
    protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) {
         if (tenantidentifer == "company01"){
        return new DatasourceConnectionProvider(DScompany01);
         } repeat....
    }
}

现在只需为每个公司数据库定义一个数据源,这样就可以通过multitenantconnectionprovider进行交换。

可以使用SessionFactory.getCurrentSession()或使用sessionFactory.withOptions().tenantIdentifier("company01").openSession()

在特殊情况下调用DAO中的sessionFactory

这应该涵盖基础知识,但可能需要对您的应用程序进行一些探索。