概述:
Hibernate 是一个开放源代码的对象/关系映射框架和查询服务。它对 JDBC 进行了轻量级的对象封装,负责从 Java 类映射到数据库表,并从 Java 数据类型映射到 SQL 数据类型。在 4.0 版本 Hibenate 开始支持多租户架构——对不同租户使用独立数据库或独立 Sechma,并计划在 5.0 中支持共享数据表模式。
在 Hibernate 4.0 中的多租户模式有三种,通过 hibernate.multiTenancy 属性有下面几种配置:
1. NONE:非多租户,为默认值。
2. SCHEMA:一个租户一个 Schema。
3. DATABASE:一个租户一个 database。
4. DISCRIMINATOR:租户共享数据表。计划在 Hibernate5 中实现。
本篇文章我们主要介绍“一个租户一个Schema”这种模式。
一个租户一个Schema
一:设置 hibernate.multiTenancy 等相关属性。
配置文件 Hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8</property>
<property name="connection.username">root</property>
<property name="connection.password">wyj</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.autocommit">false</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="show_sql">false</property>
<!-- <property name="hibernate.hbm2ddl.auto" >create</property> -->
<property name="hibernate.multiTenancy">SCHEMA</property>
<!-- 属性规定了一个合约,以使 Hibernate 能够解析出应用当前的 tenantId,-->
<!-- 该类必须实现 CurrentTenantIdentifierResolver 接口,通常我们可以从登录信息中获得 tenatId。 -->
<property name="hibernate.tenant_identifier_resolver">hotel.dao.hibernate.TenantIdResolver</property>
<!-- 指定了 ConnectionProvider,即 Hibernate 需要知道如何以租户特有的方式获取数据连接 -->
<property name="hibernate.multi_tenant_connection_provider">hotel.dao.hibernate.SchemaBasedMultiTenantConnectionProvider</property>
<mapping class="hotel.model.Guest" />
<!-- <mapping resource="hotel/model/Guest.hbm.xml" /> -->
</session-factory>
</hibernate-configuration>
二:获取当前 tenantId(用户标示)
package hotel.dao.hibernate;
import hotel.Login;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
/**
* 获取专属用户的标记。
* @author wyj
* 说明:必须实现 CurrentTenantIdentifierResolver 接口,通常我们可以从登录信息中获得 用户标示信息。
*时间:2015年6月17日 19:40
*/
public class TenantIdResolver implements CurrentTenantIdentifierResolver {
//获取当前 tenantId
@Override
public String <