`

Hibernate连接多个数据库

    博客分类:
  • Java
 
阅读更多
一、             Hibernate访问数据库时加载的过程

对于大多数使用Hibernate的朋友来说,通常使用一下方式来获得Configuration实例: Configuration configure = new Configuration().configure();

在Hibernate中,Configuration是hibernate的入口。在实例化一个Configuration的时候,Hibernate会自动在环境变量(classpath)里面查找Hibernate配置文件hibernate.properties。如果该文件存在,则将该文件的内容加载到一个Properties的实例GLOBAL_PROPERTIES里面,如果不存在,将打印信息  hibernate.properties not found;

接下来Hibernate将所有系统环境变量(System.getProperties())也添加到GLOBAL_PROPERTIES里面。如果配置文件hibernate.properties存在,系统还会进一步验证这个文件配置的有效性,对于一些已经不支持的配置参数,系统将打印出警告信息。

默认状态下configure()方法会自动在环境变量(classpath)下面寻找Hibernate配置文件hibernate.cfg.xml,如果该文件不存在,系统会打印如下信息并抛出HibernateException异常: hibernate.cfg.xml not found;如果该文件存在,configure()方法会首先访问<session-factory>,并获取该元素name的属性,如果name的属性非空,将用这个配置的值来覆盖hibernate.properties的hibernate.session_factory_name的配置的值,从这里我们可以看出,hibernate.cfg.xml里面的配置信息可以覆盖hibernate.properties的配置信息。

接下来configure()方法访问<session-factory>的子元素,首先将使用所有的<property>元素配置的信息来覆盖hibernate.properties里面对应的配置信息。

然后configure()会依次访问以下几个元素的内容

<mapping>

<jcs-class-cache>

<jcs-collection-cache>

<collection-cache>

其中<mapping>是必不可少的,必须通过配置<mapping>,configure()才能访问到我们定义的java对象和关系数据库表的映射文件(hbm.xml),例如:

<mapping resource="Cat.hbm.xml"/>

这样configure()方法利用各种资源就创建了一个Configuration实例。对于整个项目来说,如果用一个本地线程来存放这个Configuration实例,那么整个项目只需要实例化一次Configuration对象(注:Configuration实例很花费时间),也就提高了项目的效率。



二、             Hibernate访问多个数据库的配置

根据以上所述,configure()方法默认是通过访问hibernate.cfg.xml的<mapping>元素来加载我们提供的.hbm.xml文件。我们也可以直接指定hbm.xml文件,例如addClass()方法可以直接通过指定class来加载对应的映射文件,hibernate会将提供的class的全名(包括package)自动转化为文件路径,还可以用addFile方法直接指定映射文件。例如:Configuration configurate = new Configuration().addClass(“Book.class”);

Configuration configurate = new Configuration().addURL(Configuration.class.getResource ("/Book.hbm.xml"));

Configuration config = new Configuration().addFile("/Cat.hbm.xml");

这样,如果用xml配置来配置多个数据库的话,那就写多个配置文件。这里假设对应两个数据库(一个是MySQL,一个是SQLServer),我们可以把其xml文件定义为“mysql.cfg.xml”和“sqlserver.cfg.xml”。则用Configuration类获取SessionFactory的代码如下:

SessionFactory mysqlFactory = new Configuration().configure("/mysql.cfg.xml").buildSessionFactory();

SessionFactory sqlserverFactory = new Configuration().configure("sqlserver.cfg.xml ").buildSessionFactory();

同时连接两个数据库实例:

问题:连接mssql中的vedio 和bbs数据库

解决方案:

1.vedio.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory name="bbs">
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">sa</property>
<!-- 指定连接数据库的URL -->
<property name="connection.url">
  jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=vedio; 
</property>
<!-- 指定数据库使用的SQL方言 -->
<property name="dialect">
  org.hibernate.dialect.SQLServerDialect
</property>
<!-- 指定连接数据库的口令 -->
<property name="connection.password">sa</property>
<!-- 指定连接数据库的驱动程序 -->
<property name="connection.driver_class">
  com.microsoft.jdbc.sqlserver.SQLServerDriver
</property>
<!-- true表示程序运行时,在控制台显示SQL语句,false表示不显示SQL语句 -->
<property name="show_sql">true</property>
<!-- <property name="connection.pool_size">50</property> -->

<!-- 持久化类所对应的映射文件 -->
<mapping resource="vedio/Managers.hbm.xml" />


</session-factory>
</hibernate-configuration>



2. bbs.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory name="bbs">
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">sa</property>
<!-- 指定连接数据库的URL -->
<property name="connection.url">
  jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=bbs; 
</property>
<!-- 指定数据库使用的SQL方言 -->
<property name="dialect">
  org.hibernate.dialect.SQLServerDialect
</property>
<!-- 指定连接数据库的口令 -->
<property name="connection.password">sa</property>
<!-- 指定连接数据库的驱动程序 -->
<property name="connection.driver_class">
  com.microsoft.jdbc.sqlserver.SQLServerDriver
</property>
<!-- true表示程序运行时,在控制台显示SQL语句,false表示不显示SQL语句 -->
<property name="show_sql">true</property>
<!-- <property name="connection.pool_size">50</property> -->

<!-- 持久化类所对应的映射文件 -->
<mapping resource="bbs/Board.hbm.xml" />
<mapping resource="bbs/BBSUser.hbm.xml" />
<mapping resource="bbs/BBSManager.hbm.xml" />
<mapping resource="bbs/Image.hbm.xml" />
<mapping resource="bbs/Upfile.hbm.xml" />
<mapping resource="bbs/Post.hbm.xml" />
<mapping resource="bbs/BestPost.hbm.xml" />
<mapping resource="bbs/User.hbm.xml" />
<mapping resource="bbs/Groups.hbm.xml" />
<mapping resource="bbs/Help.hbm.xml" />
<mapping resource="bbs/Note.hbm.xml" />
<mapping resource="vedio/Managers.hbm.xml" />


</session-factory>
</hibernate-configuration>

3.VedioHibernateUTL.java

package vedio;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {

public static final SessionFactory sessionFactory;
  static {
   try{
    sessionFactory=new Configuration().configure("/vedio.cfg.xml").buildSessionFactory();
   
   }catch(Throwable ex) {
   
    throw new ExceptionInInitializerError(ex);
   }
  }

public static final ThreadLocal<Session> session =new ThreadLocal<Session>();

//create session
public static Session currentSession() throws HibernateException {
  Session s= session.get();
  if(s==null||!s.isOpen()) {
   s=sessionFactory.openSession();
   session.set(s);
  }
  return s;
}

//close session
public static void closeSession() throws HibernateException {
  Session s=session.get();
  session.set(null);
  if(s!=null) {
   s.close();
  }
 
}
}




4.BbsHibernateUTL.java

package bbs;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {

public static final SessionFactory sessionFactory;
  static {
   try{
    sessionFactory=new Configuration().configure("/bbs.cfg.xml").buildSessionFactory();
   
   }catch(Throwable ex) {
   
    throw new ExceptionInInitializerError(ex);
   }
  }

public static final ThreadLocal<Session> session =new ThreadLocal<Session>();

//create session
public static Session currentSession() throws HibernateException {
  Session s= session.get();
  if(s==null||!s.isOpen()) {
   s=sessionFactory.openSession();
   session.set(s);
  }
  return s;
}

//close session
public static void closeSession() throws HibernateException {
  Session s=session.get();
  session.set(null);
  if(s!=null) {
   s.close();
  }
 
}
}


然后写相应的 表名.hbm.xml文件

总结一下:一人数据源对应一个.cfg.xml文件,一个HibernateUTL.java,对应多个 表名.hbm.xml



如果你用spring,多数据库就更简单了,像这段代码可以完成所有配置:

<beans>

<bean id="mysqlDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="url">

<value>jdbc:mysql://localhost:3306/test</value>

</property>

<property name="driverClassName">

<value>org.gjt.mm.mysql.Driver</value>

</property>

<property name="username">

<value>root</value>

</property>

<property name="password">

<value>123</value>

</property>

</bean>

<bean id="mysqlFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="dataSource">

<ref local="mysqlDS"/>

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

</props>

</property>

<property name="mappingResources">

<list>

<value>test.hbm.xml</value>

</list>

</property>

</bean>

<bean id="sqlserverDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="url">

<value>jdbc:odbc:test</value>

</property>

<property name="driverClassName">

<value>sun.jdbc.odbc.JdbcOdbcDriver</value>

</property>

<property name="username">

<value>root</value>

</property>

<property name="password">

<value>123</value>

</property>

</bean>

<bean id="sqlserverFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="dataSource">

<ref local="sqlserverDS"/>

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>

</props>

</property>

<property name="mappingResources">

<list>

<value>test.hbm.xml</value>

</list>

</property>

</bean>

.......

</beans>
本文转自:http://blog.csdn.net/zhiyi2010/article/details/7644612
分享到:
评论

相关推荐

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

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

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

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

    Hibernate访问多个数据库

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

    hibernate多数据库配置

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

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

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

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

    综上所述,跨多个数据库操作和同时连接多个数据库的能力是企业级应用不可或缺的。通过Spring的事务管理、JTA和适当的事务协调器,可以有效地处理这些复杂的场景,确保数据的正确性和系统的稳定性。同时,开发者还...

    hibernate根据字段生成数据库表

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

    ssh2连接多个数据库

    SSH2框架在连接多个数据库时,主要依赖于Spring框架的灵活配置能力,以及Hibernate对多数据源的支持。在实际应用中,我们可以通过以下步骤实现这一目标: 1. **配置Tomcat的数据源** 在Tomcat服务器的`conf/...

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

    综上所述,使用Hibernate框架操作Oracle数据库涉及到了多个方面的知识,包括Hibernate的核心概念、Oracle JDBC驱动的使用、数据库配置、实体映射、持久化操作、查询方式以及事务管理等。理解并掌握这些知识点,能够...

    Hibernate 多数据库支持解决方案

    Hibernate是一个强大的Java持久化框架,它允许开发者将对象模型与关系数据库进行映射,从而简化了数据库操作。在处理多数据库支持时,Hibernate提供了一些策略和技巧来确保应用程序能够在不同类型的数据库之间灵活...

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

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

    Hibernate连接数据库的注册的项目

    总的来说,使用Hibernate连接数据库注册项目涉及到多个步骤,包括配置文件的设置、实体类的定义、SessionFactory的创建、事务管理以及各种持久化操作。熟悉这些知识点能帮助开发者高效地实现Java应用与数据库的交互...

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

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

    根据hibernate配置文件生成数据库.zip

    在IT行业中,Hibernate是一个非常流行的Java持久化框架,它简化了与关系型数据库的交互,尤其是在对象关系映射(ORM)方面。本压缩包“根据hibernate配置文件生成数据库.zip”包含了一些关键资源,帮助开发者理解...

    hibernate 与 各种数据库连接配置

    在大型应用中,可能需要连接多个数据库。在这种情况下,可以通过添加多个`session-factory`节点并分别配置不同的数据源。每个`session-factory`都包含一套独立的数据库连接参数。 ### 5. 高级配置 除了基本配置外...

    hibernate自动生成数据库文件

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

    hibernate连接oracle数据库.pdf

    本文详细介绍了如何使用Hibernate连接Oracle数据库进行开发,涵盖了环境搭建、数据库表结构设计、配置文件设置以及实体映射与持久化操作等多个方面。通过本文的学习,读者应能掌握使用Hibernate框架进行Oracle数据库...

    跨多个数据库操作,同时连接两个一上的数据库,用事物关联起来

    Spring与Hibernate整合时,也可以配置多数据库事务,确保在操作多个数据库时的事务一致性。Spring集成JOTM(Java Open Transaction Manager)的JTA事务管理则提供了另一种选择,JOTM是一个开源的JTA事务管理器,适用...

    hibernate数据库连接

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

Global site tag (gtag.js) - Google Analytics