`
zldy2818
  • 浏览: 12907 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

 
阅读更多

【原创】Hibernate 连接访问多个数据库(含访问不同数据库的相同表)

网上问的人也很多,实现方法大体类似,本人将实际过程中的实现简化,希望能抛砖引玉。


利用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 implements IBaseHibernateDAO {

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

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

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

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

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

public class UserDAO extends BaseHibernateDAO {

    //因为父类将无参构造设置为了private,所以该类只能存在有参构造了。
    public UserInfoTbDAO(String dbName) {
       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 void testSaveUser(UserTb user){

UserDAO userDao_1 = new UserDAO("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实例。

分享到:
评论

相关推荐

    hibernate同时配置多个数据库连接

    本文将详细讲解如何在Hibernate中配置和管理多个数据库连接。 首先,我们需要理解Hibernate的核心配置文件`hibernate.cfg.xml`。在常规配置中,我们通常只配置一个数据库连接。但在多数据库连接的场景下,我们需要...

    Hibernate访问多个数据库

    总结来说,Hibernate访问多个数据库的关键在于为每个数据库创建单独的配置和`SessionFactory`。在XML配置文件中,每个数据库的连接信息、方言和映射文件都需要明确指定。而在Spring环境中,我们可以利用IoC容器和...

    spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目

    "spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目"是针对这种需求的一个解决方案,旨在提供一种灵活且动态的数据源切换机制。 首先,Spring框架作为Java领域中最受欢迎的应用框架之一,其强大...

    Hibernate多对多实例+数据库代码

    在数据库设计中,多对多关系是最复杂的一种关系类型,因为它涉及到两个表之间存在多个对应关系。例如,学生和课程之间的关系就是多对多:一个学生可以选修多门课程,而一门课程也可以被多名学生选修。在Hibernate中...

    hibernate数据库访问接口设计

    总结,Hibernate 数据库访问接口设计涵盖了从基础的数据库连接、对象持久化到高级的查询语言、缓存机制等多个方面。熟练掌握这些接口和概念,能极大地提升Java开发者的数据库操作能力。在实际项目中,应根据需求选择...

    跨多个数据库操作,同时连接多个的数据库,同时操作

    在复杂的企业级系统中,往往需要连接并操作多个数据库,以满足不同业务场景的需求。这通常涉及到跨数据库操作和分布式事务处理,确保数据的一致性和完整性。以下是一些关于这个主题的重要知识点: 1. **JTA(Java ...

    hibernate多数据库配置

    首先,创建一个父数据源(parentDataSource),用于配置多个数据源共有的信息: ```xml <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="username" value="root">...

    数据库连接池以及hibernate对各种连接池的整合

    数据库连接池的基本原理是预先创建一定数量的数据库连接,当应用程序需要访问数据库时,可以从池中获取一个已建立的连接,使用完毕后归还给池而不是直接关闭,这样避免了频繁的创建和销毁连接带来的开销。...

    hibernate框架下对oracle数据库操作所需jar包.zip

    在Hibernate中,每个数据库表都对应一个Java实体类,通过注解或XML配置文件(`hbm.xml`)进行映射。例如,一个名为`User`的表可以对应一个`User.java`实体类,并通过`@Entity`注解标记为Hibernate实体。 6. **...

    Hibernate 多数据库支持解决方案

    在处理多数据库支持时,Hibernate提供了一些策略和技巧来确保应用程序能够在不同类型的数据库之间灵活切换。以下是一些关键点的详细说明: 1. **去掉数据库级的外键关联** - 在多数据库环境中,由于不同数据库对外...

    hibernate根据字段生成数据库表

    这种情况下,手动为每个数据库创建相同的表结构既耗时又容易出错。Hibernate 提供了一个非常实用的功能——基于实体类自动生成数据库表,这不仅能够显著提高开发效率,还能减少人为错误。本文将详细介绍如何利用 ...

    一套Spring+Hibernate的多个数据库切换的源码

    本项目"一套Spring+Hibernate的多个数据库切换的源码"提供了一个实现这一功能的示例,它利用了Spring框架的强大功能和Hibernate的持久化能力,实现了灵活的数据源切换。 首先,Spring框架是Java开发中最常用的应用...

    hibernate映射文件生成数据库

    每个类对应一个数据库表,类的属性对应表的列。 2. 编写映射文件:对于每个实体类,编写相应的Hibernate映射文件。映射文件中,你需要指定表名、列名、数据类型以及主键生成策略等。例如: ```xml <hibernate-...

    hibernate实现数据库表的多种关系

    本示例着重于如何利用Hibernate来实现不同类型的数据库表之间的关联,包括一对一、一对多、多对一以及多对多的关系。 **一对一关系:** 一对一关联通常发生在两个表之间有唯一对应关系时,比如一个用户只有一个账号...

    hibernate配置数据库连接池的三种方法

    在没有连接池的情况下,每次需要与数据库交互时,程序都会创建一个新的连接,执行完毕后再关闭该连接。这种做法在频繁的数据库操作中会消耗大量资源,因为建立和关闭连接的过程是相对耗时的。 连接池通过预先创建并...

    hibernate数据库连接

    每个数据库事务通常对应一个Session实例。 **三、Hibernate的数据访问** 1. **实体类**:在Hibernate中,数据库表对应的Java类称为实体类,通过注解如@Entity和@Table来标识。 2. **主键策略**:@Id注解用于标记...

    hibernate自动生成数据库文件

    综上所述,Hibernate自动生成数据库文件涉及到ORM设计、Hibernate Tools的使用、配置文件的编写、Java注解的理解以及数据库操作的最佳实践等多个方面。掌握这些知识点有助于高效地利用Hibernate进行数据库开发。

    Spring+Hibernate下的数据库连接动态切换

    1. **数据源配置**:首先需要配置多个数据源以支持不同的数据库连接。这里我们不直接在Spring的配置文件中硬编码多个数据源,而是采用更加灵活的方式。 2. **数据源管理**:使用工厂模式或缓存机制来动态生成数据源...

Global site tag (gtag.js) - Google Analytics