0

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

4

1 回答 1

1

根据您使用的休眠版本,您可以使用休眠的内置多租户功能。为此,您需要实施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;
        }

    }

多租户连接提供者:

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....
    }
}

现在只需为每个公司数据库定义一个数据源,以便它可以由多租户连接提供程序交换。

可以通过使用SessionFactory.getCurrentSession()或在特殊情况下通过使用来调用 DAO 中的 sessionFactorysessionFactory.withOptions().tenantIdentifier("company01").openSession()

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

于 2013-05-27T08:55:53.110 回答