利用hibernate访问不同数据库中的不同表或不同数据库中的相同表。

本人在开发过程中的解决方案,希望大家交流。
一般用myEclipse工具会自动生成Hibernate的相关文件,大致有下面几类:

(1)数据库配置文件:.cfg.xml
(2)映射文件.hbm.xml
(3)映射类:pojo
(4)会话工厂类:SessionFactory
(5)基础DAO接口:IBaseHibernateDAO
(6)DAO接口的实现基础类:BaseHibernateDAO
(7)数据访问对象:DAO。所有DAO默认继承BaseHibernateDAO

当然,不同的工具生成的文件也略有差异,但不影响实现思路。

一般工具生成的配置只针对一个数据库,所以都生成了一个数据库配置文件。
下面我以访问不同数据库中相同的表做例子,访问不同数据库的不同表原理类同。
假设有两个数据库db1和db2,两个库中都有user表,要实现对两个数据库中的表访问,操作如下:

(1)配置两个数据库配置文件:db1.cfg.xml和db2.cfg.xml,分别连接两个数据库。
(2)配置两个SessionFactory:SessionFactory_db1绑定db1.cfg.xml,SessionFactory_db2,绑定db2.cfg.xml。
(3)基础DAO接口:IBaseHibernateDAO保持不变,代码默认如下
public interface IBaseHibernateDAO {
public Session getSession( );

}

(4)DAO接口的实现基础类:BaseHibernateDAO改造后如下:

public class BaseHibernateDAO implementsIBaseHibernateDAO {

private String dbName;//要连接的数据库

// 为了保证每个DAO能够正确指定所操作的数据库,将无参构造设为私有 
private BaseHibernateDAO() { }

// 指定目标数据库的DAO构造方法 
public BaseHibernateDAO(StringdbName) {
   this.dbName = dbName;
}

//重写getSession()方法,使之能够访问不同的数据库
public Session getSession() {
   if (dbName == null) {
    return null;
   }else if (dbName.equals("db01")){   
   returnSessionFactory_db01.getSession();//连接db01库
   } else if (dbName.equals("db02")) {   
   returnSessionFactory_db02.getSession();//连接db02库
   } else {
    return null;
   }
}
}

(5)改造自动生成用户表对应的DAO——UserDAO类:即继承父类BaseHibernateDAO的有参构造。

public class UserDAOextends BaseHibernateDAO {

//因为父类将无参构造设置为了private,所以该类只能存在有参构造了。
    public UserInfoTbDAO(StringdbName) {
       super(dbName);  
    }

//以下是自动生成的代码:
    public void save(UserTb transientInstance){        
        try {
           getSession().save(transientInstance);
           log.debug("save successful");
        } catch (RuntimeException re) {
           log.error("save failed", re);
            throw re;
        }
    }
}

(6)应用层的测试

public voidtestSaveUser(UserTb user){

UserDAO userDao_1 = newUserDAO("db01");//得到db01库的DAO
UserDAO userDao_2 = new UserDAO("db02");//得到db02库的DAO

//假设两个库中的数据要同步更新(实际操作中应该加入事务控制)
userDao_1.save();//更新01库
userDao_2.save();//更新02库

}

(7)总结:
优点:
1.代码改动比较小,能充分利用工具生成的代码。
2.结构简单,访问灵活。
3.访问不同库的同一个表,只需一个DAO,一个pojo,无需写额外代码。

缺点:
1.每次连接数据库时都要指定访问的数据库。
2.为了有效指定数据库逻辑名,和利于维护,就得“db01”这样的字符串设置为全局的final变量,或者弄

一个DAO工厂来产生不同的DAO实例。

另一种方法:
上面的方法是改造了DAO的构造方法。也可以改造getSession()方法,这样透明度更高,但略欠灵活。

本人刚刚接触Hibernate,不知以上设计是否妥当,望高手指点一二。

Hibernate 连接访问多个数据库(含访问不同数据库的相同表)(转)的更多相关文章

  1. ADO.NET 连接方式和非链接方式访问数据库

    一.//连接方式访问数据库的主要步骤(利用DataReader对象实现数据库连接模式) 1.创建连接对象(连接字符串) SqlConnection con = new SqlConnection(Co ...

  2. Spring框架中 配置c3p0连接池 完成对数据库的访问

    开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...

  3. 前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误。    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected est

    前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: ...

  4. 数据库访问优化漏斗法则- 四、减少数据库服务器CPU运算

    数据库访问优化漏斗法则这个优化法则归纳为5个层次:1.减少数据访问次数(减少磁盘访问)2.返回更少数据(减少网络传输或磁盘访问)3.减少交互次数(减少网络传输)4.减少服务器CPU开销(减少CPU及内 ...

  5. SpringBoot 整合 hibernate 连接 Mysql 数据库

    前一篇搭建了一个简易的 SpringBoot Web 项目,最重要的一步连接数据库执行增删改查命令! 经过了一天的摸爬滚打,终于成功返回数据! 因为原来项目使用的 SpringMVC + Hibern ...

  6. 【问题&解决】试用版SQL Server 2008 R2 提示评估期已过,数据库不能访问解决办法

    因为以前一直是试用版,重启服务器之后,突然数据库不能访问,提示评估期已过,都快吓死了.还好找到了解决办法特copy解决步骤如下: (笔者用的是企业版: R88PF-GMCFT-KM2KR-4R7GB- ...

  7. 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能

    原文:走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能 最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下  我们来分享一下蔡老给我们 ...

  8. 访问内网中的sql server数据库的简便方法

    前言: 有时候我们要访问局域网内的 sql server服务器,比如测试环境数据库在公司内网,回到家或在客户现场要连接内网中的数据库 第一步:假如可以连接局域网的数据库 192.168.150.129 ...

  9. 记一次MySQL数据库拒绝访问的解决过程

    问题背景 用wordpress搭博客,数据库采用MySQL.为了调试方便,创建账户my_account ,允许它从任意主机访问数据库. CREATE USER `my_account`@'%' IDE ...

随机推荐

  1. C++ 第四课:ASCII 码表

    下面的 ASCII 码表包含数值在0-127之间的字符的十进制.八进制以及十六进制表示. 十进制 八进制 十六进制 字符 描述 0 0 00 NUL   1 1 01 SOH start of hea ...

  2. 通过实例看懂diff命令输出

    摘自:http://blog.sina.com.cn/s/blog_612144f30100nkpt.html ############################### 实例: 有这样两个文件: ...

  3. QtWebkit包含的类简介

    前言 WebKit从Qt 4.4开始被作为一个Module被集成到Qt中.简单的说,Qt webkit就是Qt对Apple公司webkit的支持而开发的库,主要包括以下几个类: QWebDatabas ...

  4. Android——开机自启动app

    android在开机完成后会发送一个android.intent.action.BOOT_COMPLETED的广播,告诉系统内app们已经开机. 我们可以在需要开机自启动的app中定义一个广播接收器, ...

  5. Maven项目继承与聚合

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6628534.html  一:继承 在Java编程中,如果多个类都使用到了相同的内容.方法时,我们可以用继承的方 ...

  6. cocos2d-js 3.0 RC0 监听返回键、菜单键、进入后台(home键)、恢复显示等事件

    cc.eventManager.addListener({ event: cc.EventListener.KEYBOARD, onKeyReleased: function(keyCode, eve ...

  7. 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)

    开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...

  8. 【转载】Java 网络编程

      本文主要是自己在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,介绍Java中的网络编程. 一. ...

  9. django之创建第8-1个项目-数据库之增删改查/数据库数据显示在html页面

    1.为test.DB数据库预先创建下面数据 1    张三    16    2015-01-02    12    李四    17    2015-01-04    13    王五    14  ...

  10. ArcGIS进行自定义投影转换(重投影)

    这里记录一下使用自定义七参数进行投影转换的过程. 1.主动创建自定义地理(坐标)变换 首先在系统工具箱里面选择创建自定义地理(坐标)变换 在弹出的窗口中输入相关参数即可. 转换方法选择COORDINA ...