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

转载 2012年02月15日 15:28:08

在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法时间:2009-11-09 csdn博客 老紫竹 需求很简单,相同的操作,比如表结构完全相同,程序也完全相同,但需要根据某些条件,分别向不同的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系统只有一个。

本文来自编程入门网:http://www.bianceng.cn/Programming/Java/200911/12028.htm

 

相关文章推荐

spring+hibernate架构中Dao访问数据库的几种方法

spring+hibernate架构中Dao访问数据库的几种方法 : 在spring+hibernate的架构中,访问数据库有几种方法,按spring依赖注入来区分有3种,在这之前先再来了解一下sp...
  • fxhchl
  • fxhchl
  • 2011年04月20日 17:26
  • 332

Ibatis和Hibernate 数据库分表(动态表名映射)的实现方法

自从ibatis 2.0.9以后,ibatis支持动态表名。  以下为用Map做参数的动态表名实现方法: 示例代码如下:  Sample :   remapResults ="true" ...
  • zdnlp
  • zdnlp
  • 2013年11月04日 14:56
  • 1700

Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法 一、开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hi...

Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

文章来源:http://www.cnblogs.com/hoojo/p/Spring_Hibernate_MyBatis_MultipleDataSource_switchDataSource.htm...

Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

一、开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能。所以在出来数据库方言的...

Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

一、开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能。所以在出来数据库方言的时候...
  • tan0802
  • tan0802
  • 2016年05月31日 11:19
  • 344

Oracle 数据库中,不同数据库的表间记录进行复制或迁移时会用以下几种方法:

在 Oracle 数据库中,通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中 2. 建立数据...

在 Oracle 数据库中,通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:

在 Oracle 数据库中,通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中 2. 建立数据...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法
举报原因:
原因补充:

(最多只允许输入30个字)