在这里我有一个问题,我想在这里找到一个解决方案,我在我的项目中使用spring mvc和hibernate处理一个项目我有几个具有相同架构的数据库(公司数据库)和一个用于身份验证的数据库,当用户登录时我必须生成一个与用户公司的数据库相对应的 SessionFactory,你能帮我提供一个架构并给我一些例子吗,对不起我的英语。
问问题
823 次
1 回答
1
根据您使用的休眠版本,您可以使用休眠的内置多租户功能。为此,您需要实施CurrentaTenantIdentifierResolver
并MultiTenantConnectionProvider
遵循本文档本文档
必须另外设置以下 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 回答