多租户--hibernate实现

本文介绍了Hibernate在4.0版本中对多租户架构的支持,重点讲解了'一个租户一个Schema'的实现方式,包括配置属性设置、获取tenantId、数据库连接获取、POJO类设计以及测试案例。此外,还探讨了共享数据库、共享Schema模式的实现,并讨论了缓存策略对多租户应用性能的影响。文章最后指出Hibernate对多租户的实现仍有提升空间,期待Hibernate5的改进。
摘要由CSDN通过智能技术生成

概述:

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&amp;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 <
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值