一、(在src下)写两个Hibernate.cfg.xml文件:
hbn-mysql.cfg.xml和hbn-sqlserver.cfg.xml
二、分别解析上面的两个.cfg.xml文件建两个sessionFactory,
三、使用session时哪个sessionFactory打开的session就能访问哪个数据库。
详细步骤:-----------------------------------------
一、(在src下)建两个Hibernate.cfg.xml文件
(1.)hbn-mysql.cfg.xml的内容:
mysql jdbc:mysql://localhost:3306/dataSource?characterEncoding=utf-8 com.mysql.jdbc.Driver root password org.hibernate.dialect.MySQLDialect
(2.)hbn-sqlserver.cfg.xml的内容:
true com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://192.168.2.16:1433; DatabaseName=DB root password 2 org.hibernate.dialect.SQLServerDialect
二、建一个类(HbnUtil)用于连接数据库(用于创建sessionFactory和openSession()静态方法)
package com.fourstar.starTransport.dao.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HbnUtil {// 根据hibernate.cfg.xml创建一个静态sessionFactory private static SessionFactory sf; private static SessionFactory MSsf; static { sf = new Configuration().configure("/hbn-sqlserver.cfg.xml") .buildSessionFactory(); MSsf = new Configuration().configure("/hbn-mysql.cfg.xml") .buildSessionFactory(); } /**根据DBName判断调用哪个sessionFactory的openSession()方法*/ public static Session getSessionByDB(String DBName) { Session s = null; if (DBName == "mysql") { if (!MSsf.isClosed()) s = MSsf.openSession(); } else if (DBName == "sqlserver") { if (!sf.isClosed()) s = sf.openSession(); } else { System.out.println("错误的 DBName!"); } return s; } /**根据DBName判断调用哪个sessionFactory的close()方法*/ public static void closeSessionFactoryByDB(String DBName) { if (DBName == "mysql") { if (!MSsf.isClosed()) { MSsf.close(); } } else if (DBName == "sqlserver") { if (!sf.isClosed()) { sf.close(); } } else { System.out.println("错误的 DBName!"); } } }
三、测试:使用getSessionByDB(String DBName)获得不同数据库的session
package com.fourstar.starTransport.dao.util; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; public class Test1{ public static void main(String[] args) { String DBName = "mysql"; // String DBName = "sqlservrer"; Session s = HbnUtil.getSessionByDB(DBName); try { String sql = " from freightCompany"; Query query = s.createQuery(sql); } catch (HibernateException e) { e.printStackTrace(); }finally{ s.close(); HbnUtil.closeSessionFactoryByDB(DBName); } } }
————————————————————————————————————————
————————————————————————————————————————
做完这些之后我再介绍下hibernate连接两个数据库的原理:
——————————————————————————————————————
一、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.cfg.xml映射文件使得configuration对象的实例化的方法new Configuration().configure()。如果我们需要连接两个数据库就需要解析两个hibernate映射文件去实例化两个configuration对象,我们使用方法new Configuration().configure(“hibernate文件路径”)。然后使用configuration对象的 buildSessionFactory()方法去创建session工厂。有了session工厂就可以生产数据库操作对象session了。