这里我有一个问题,我想在这里找到一个解决方案,我在项目中使用spring mvc和hibernate工作我有几个具有相同架构的数据库(按公司数据库)和一个用于身份验证的数据库,当用户登录我必须生成一个与用户公司数据库对应的SessionFactory,你可以通过向我提供一个架构来帮助我,请给我一些例子,对不起我的英语。
答案 0 :(得分:1)
根据您使用的hibernate版本,您可以使用hibernate的内置多租户功能。为此,您需要按照此文档this documentation
实施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;
}
}
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()
这应该涵盖基础知识,但可能需要对您的应用程序进行一些探索。