spring mvc hibernate创建和操作多个数据库的sessionfactorys [英] spring mvc hibernate creating and manipulating sessionfactorys of several databases

查看:275
本文介绍了spring mvc hibernate创建和操作多个数据库的sessionfactorys的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在这里我有一个问题,我想在这里找到一个解决方案,我在一个项目中使用spring mvc和hibernate在我的项目中工作我有几个数据库具有相同的体系结构(数据库由公司)和数据库进行身份验证,当用户登录我必须生成一个SessionFactory对应于用户公司的数据库,你能帮我提供一个架构,并给我一些例子,请抱歉我的英语。

解决方案

根据您使用的是哪个hibernate版本,您可以使用hibernate的内置多租户功能。为此,您需要在本文档 CurrentaTenantIdentifierResolver 和 MultiTenantConnectionProvider 。 jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch16.htmlrel =nofollow>本文档



以下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 {


$ b @Override
public String resolveCurrentTenantIdentifier(){
if(SecurityContextHolder。 getContext()。getAuthentication()。getPrincipal()。yourOwnRoutineToDetermineCompanyxxx ==companyxxx){
returncompanyxxx;

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

@Override
public boolean validateExistingCurrentSessions(){
return true;


$ b code $
$ MultiTenantConnectionProvider

  public class MultiTenantConnectionProviderImpl extends AbstractMultiTenantConnectionProvider {
@Autowired
private DataSoruce DScompany02;
@Autowired
私有DataSource DScompany01;
@Autowired
私有DataSource默认值;

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

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

现在只需为每个公司的数据库定义一个数据源,以便它可以由multitenantconnectionprovider交换。


$ b 在DAO中调用sessionFactory可以通过使用 SessionFactory.getCurrentSession()或在特殊情况下使用 sessionFactory.withOptions()。tenantIdentifier(company01)。openSession()



这应该涵盖基本的内容,但可能需要一些时间来检查您的应用程序。


here I have a problem that I want to find a solution here, I work on a project using spring mvc and hibernate in my project I have several databases with same architecture (database by company) and a database for authentication, when the user login i have to generates a SessionFactory that corresponds to database of the user company, can you help me by offering me an architecture and give me some examples please, sorry for my English.

解决方案

Depending on which hibernate version you use you can just utilize the built in multi tenant features of hibernate. For that you need to implement the CurrentaTenantIdentifierResolver and MultiTenantConnectionProvider following this documentationthis documentation

the following hibernateProperties have to be set additionaly to use them:

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

Sample Implementation: 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....
    }
}

now just define a datasource per company DB so it can be swapped by the multitenantconnectionprovider.

A call to the sessionFactory in the DAO can be made by using SessionFactory.getCurrentSession() or in special cases by using sessionFactory.withOptions().tenantIdentifier("company01").openSession()

This should cover the basics but might need some tayloring to your application.

这篇关于spring mvc hibernate创建和操作多个数据库的sessionfactorys的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆