hibernate - 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;
}
}
解决方案
推荐阅读
- python - 使用 Django 批量更新插入
- ruby - 如何在 MacOS 上使用 rbenv 设置 Ruby 的版本?
- sql - 动态查询所有符合条件的SQL表
- ms-access - [MS ACCESS]根据其他列的内容生成结果列?
- c# - 在 asp.net 中打开一个弹出窗口而不显示页面的 url
- apache-nifi - 如何在 ApacheNifi 中使用 ExtractGrok 处理器获取多行?
- haskell - 如何使用 yesod-persistent 创建单列列表?
- javascript - 使用解构将新属性分配给对象
- python - Python C 扩展 - 如何将 Python 字符串映射到 C 宏常量?
- c# - 动态构建 URL,但它是自动编码的