首页 > 解决方案 > Spring mvc休眠多租户数据库方法

问题描述

调度程序-servlet.xml

com.afflatus.edu.thoth.entity ${hibernate.dialect} ${hibernate.show_sql} ${hibernate.dbm2ddl} 数据库 com.afflatus.edu.thoth.connection.MultiTenantConnectionProviderImpl com.afflatus.edu.thoth.context.MultiTenantIdentifierResolverImpl

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
   <property name="autodetectDataSource" value="false" />
   <property name="sessionFactory" ref="sessionFactory" />
</bean

这是多租户

package com.domain.multitenancy;

import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

public class CurrentTenantIdentifierResolverimpl implements CurrentTenantIdentifierResolver {

    @Override
    public String resolveCurrentTenantIdentifier() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        String tenantId = auth.getName(); 
        if (tenantId==null){
            
            return "tenantId1";
        }
        
        
        return tenantId;
    }

    @Override
    public boolean validateExistingCurrentSessions() {
        // TODO Auto-generated method stub
        return false;
    }

这是当前的租户标识符代码,我从 spring 上下文中获取值作为租户

package com.domain.multitenancy;

import javax.sql.DataSource;

import 
org.hibernate.engine.jdbc.connections.spi.AbstractDataSourceBasedMultiTenantConnectionProviderImpl;

import com.domain.master.MasterService;



    public class MultiTenantConnectionprovideImpl extends
            AbstractDataSourceBasedMultiTenantConnectionProviderImpl  {

        @Override
        protected DataSource selectAnyDataSource() {
         return MasterService.getDataSourceHashMap().get("tenantId1");
        }

        @Override
        protected DataSource selectDataSource(String tenantIdentifier) {
        
        return MasterService.getDataSourceHashMap().get(tenantIdentifier);
        }
       
        
    

    
}

这是主数据库源

package com.domain.master;

import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
import java.util.HashMap;



public class MasterService {
    
     public static HashMap<String, DataSource> getDataSourceHashMap() {
         
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3306/multiten");
            dataSource.setUsername("root");
            dataSource.setPassword("root");
            
            DriverManagerDataSource dataSource1 = new DriverManagerDataSource();
            dataSource1.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource1.setUrl("jdbc:mysql://localhost:3306/multiten_1");
            dataSource1.setUsername("root");
            dataSource1.setPassword("root");
            
            HashMap<String, DataSource> hashMap = new HashMap<String, DataSource>();
            hashMap.put("tenantId1", dataSource);
            hashMap.put("kartiktamta@gmail.com", dataSource1);
            return hashMap;
        }

    }

标签: hibernatespring-mvcspring-securitymulti-tenant

解决方案


推荐阅读