在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法

需求很简单,相同的操作,比如表结构完全相同,程序也完全相同,但需要根据某些条件,分别向不同的schema做操作。

比如,如果当前处理的是A公司,那么向SchemaA 里面保存数据,如果当前处理的是B公司的,则向SchemaB里面保存数据。

其实就是一套程序,实现后台的动态切换。

我这里提供几种方法,大家自己根据情况考虑,都能实现,注意是实现,不一定适合于正式应用。

方法一:

在Hibernate里面,有一个配置参数,比如下面这个带Schema配置的映射

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.csc.poimanager.dao.Poi" table="POI" schema="P_BEIJING">
<id name="poiId" type="java.lang.Long">
<column name="POI_ID" precision="10" scale="0" />
<generator class="increment" />
</id>
<property name="cnName" type="java.lang.String">
<column name="CN_NAME" length="1000" />
</property>
</class>
</hibernate-mapping>

其中的schema="P_BEIJING"将 Schema写死了。

我们可以不写这部分,而是使用系统的配置参数

<property name="hibernate.default_schema">POI_BEIJING</property>

这样的话,我们的映射文件就变成了

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.csc.poimanager.dao.Poi" table="POI"">
<id name="poiId" type="java.lang.Long">
<column name="POI_ID" precision="10" scale="0" />
<generator class="increment" />
</id>
<property name="cnName" type="java.lang.String">
<column name="CN_NAME" length="1000" />
</property>
</class>
</hibernate-mapping>

在调用的时候,动态的指定Schema的参数就行了,比如

public static SessionFactory rebuildSessionFactoryForChangeSchema(String newSchema){
try {
Properties p = configuration.getProperties();
System.out.println("---" + p);
p.put("hibernate.default_schema", newSchema);
sessionFactory = configuration.buildSessionFactory();
System.out.println(" change schema successfully ......... ");
return sessionFactory;
} catch (Exception e) {
System.err
.println("%%%% rebuild session factory failed for changing schema %%%%");
e.printStackTrace();
return null;
}
}

这个方法能实现切换,但是我们必须每次都返回一个SessionFactory, 否则在并发的时候就会出问题。因为hibernate.default_schema系统只有一个。

时间: 2024-12-10 01:55:08

在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法的相关文章

在Hibernate中动态切换Schema

如果你在调用hibernate的时候需要切换scheme怎么办呢. 在oracle中,不同的用户,使用不同的schema.在hibernate的POJO中,会指定了schema <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "ht

php访问查询mysql数据的三种方法

1. $row = mysql_fetch_row($result); 返回一个规则的数组$row,$row[0]是第一个元素,$row[1]是第二个元素,依次类推... mysql_num_fields($result) 返回结果的元素个数. 2. $row = mysql_fetch_array($result); 返回一个数组$row. 举例如下: 表结构如下: username | password ------------------------------------- bourbo

asp存储过程高效的动态查询结果的数据库分页三种方法

sqlPS= "select   *   From   Employee   Left   JOIN   Department   ON   Employee.DepartmentID=Department.DepartmentID   Order   By   Employee.DepartmentID,Employee.EmNO " call   GetPage_RSDT(sqlPS,con,intListCount, "PageControl ", "

php访问查询mysql数据的三种方法_php基础

1. $row = mysql_fetch_row($result); 返回一个规则的数组$row,$row[0]是第一个元素,$row[1]是第二个元素,依次类推... mysql_num_fields($result) 返回结果的元素个数. 2. $row = mysql_fetch_array($result); 返回一个数组$row. 举例如下: 表结构如下: username | password ------------------------------------- bourbo

动态网页设计:ASP连接数据库的11种方法

动态|连接数据库|设计|网页|网页设计 ASP连接的11种方法--本文总结了使用ASP链接各种的方法: 1.Access的DSN-less连接方法: setadocon=Server.Createobject("adodb.connection")adoconn.Open"Driver={MicrosoftAccessDriver(*.mdb)};DBQ="&_Server.MapPath("所在路径") 2.AccessOLEDB连接方

请教:spring配置mysql/access多数据源的动态切换问题,急用,十分感谢!

问题描述 请教:spring配置mysql/access多数据源的动态切换问题,急用,十分感谢! 请教:spring配置mysql/access多数据源在切换到access数据源时抛No Session found for current thread错误是怎么回事?请大侠详加指导,十分感谢,急用!我的配置文件如下: <?xml version="1.0" encoding="UTF-8"?> xsi:schemaLocation="http:

国际化-spring mvc4 动态切换语言不起作用

问题描述 spring mvc4 动态切换语言不起作用 我利用 SPRING4 MVC配置了动态切换语言,但是在页上点击中文.英文切换的时候不起作用.请高手看看 <?xml version=""1.0"" encoding=""UTF-8""?><beans xmlns=""http://www.springframework.org/schema/beans"" xm

ssh 多数据源问题!-spring多数据源动态切换问题

问题描述 spring多数据源动态切换问题 一个总公司托管了N个子公司,每个子公司对应自己的数据库,我的程序实现每个子公司根据用户名登录的时候,只访问自己的数据库,而且公司的数目还在增加,这就涉及到了动态切换多数据源的问题!,还涉及到多个用户登录的时候的并发问题!急求解决,谢谢! 解决方案 目前很多项目中只能配置单个数据源,那么如果有多个数据源肿么办?Spring提供了一个抽象类AbstractRoutingDataSource,为我们很方便的解决了这个问题.1.写一个DynamicDataSo

ajaxFileUpload 动态创建iframe 但是访问报没有权限是什么原因

问题描述 ajaxFileUpload 动态创建iframe 但是访问报没有权限是什么原因 var xml = {}; if (s.global) jQuery.event.trigger(""ajaxSend"" [xml s]); //触发ajaxSend方法 // Wait for a response to come back var uploadCallback = function (isTimeout) {//回调函数 **** var io = do