Hibernate访问多个数据库
作者:杨晓
来源:http://blog.sina.com.cn/u/1237288325
一、 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();
如果你用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>
以上只是配置Hibernate访问多个数据库的一般方法,hibernate还有很多可行的配置,有兴趣的读者可以参考它的reference。
关于作者:
杨晓,北京工商大学计算机硕士,曾在NEC-SI、Softbrain 担任java开发工作。
博客:http://blog.sina.com.cn/u/1237288325
MSN: South-Titan@hotmail.com
分享到:
相关推荐
3. 工程项目生命周期:项目从启动、规划、执行、监控和收尾五个阶段构成。每个阶段都包含特定的管理活动和输出成果。 4. 工程项目管理过程:涉及项目的启动、规划、执行、监控和收尾等过程。这些过程需要密切协调,...
数据库SELECT语句总结 本文总结了数据库SELECT语句的各种应用,包括插入、修改、查询、添加数据行、排序、对比等数据操作语句。这些语句对数据库操作非常实用。 插入数据行 INSERT 语句用于插入新的数据行到...
参考书籍涵盖SQL Server 2005、PowerBuilder数据库开发、数据库系统教程等多个方面,表明在设计过程中,学生可能会利用多种资源来加深对数据库原理和应用的理解。 这个课程设计不仅锻炼了学生的数据库设计能力,还...
《数据库课程设计——学生选课...总结,本次设计锻炼了学生在数据库设计与管理方面的能力,涵盖了需求分析、概念设计、逻辑设计、数据库结构设计、功能设计等多个关键环节,为实际的教育信息化提供了有价值的实践案例。
2110461106杨晓羽SQLQuery1.sql
《雨霖铃》是宋代词人柳永的代表作,以其...《雨霖铃》的教学旨在引导学生深入理解词的意象与情感,通过品读和讨论,培养他们对古代诗词的鉴赏能力和情感共鸣,同时也让柳永的千古离愁穿越时空,触动每一个读者的心弦。
项目主文件,文件内含有两个函数。 预约程序,用来测试是否能够正常预约。运行效果如下。 欢迎使用ddddocr,本项目专注带动行业内卷,个人博客:wenanzhe.com 训练数据支持来源于:...
【报告作者】:杨晓 【相关研究】:本报告是太平洋证券经济周期系列的一部分,包括对房地产周期对经济的影响,房地产各线城市销售和投资预测,以及房地产政策调控空间的研究。 综上所述,美国经济在2020年的复苏之...
课程涵盖计算机科学、软件工程、管理学、经济学、法学等多个领域,通过不同类型的媒体形式如录像导学和SAM导学,帮助学生深入理解和掌握课程内容。 1. 计算机科学与技术: - 计算机应用基础:由张月琴主讲的SAM...
陕西多元化养老服务体系建设研究_杨晓.caj
- 系统结构:系统可能包含多个层次,如表示层、业务逻辑层和数据访问层,各层之间有明确的职责划分。 - 角色访问控制:系统通过角色访问控制机制,决定用户是否能访问特定资源。 4. 功能模块设计 - 用户管理:此...
基于达曼光栅的激光雷达线阵照明研究_杨晓旦.caj
6. 行为问题的关注:杨晓龙的迟到问题表明,即便学生在其他方面表现良好,特定行为问题也需要得到关注和解决。教师和家长需要持续跟进,寻找有效措施,帮助学生改正不良习惯。 总之,家访作为教育的一部分,揭示了...
1、数据来源:国泰安数据库 2、时间跨度:1998-2019 3、区域范围:各上市公司 4、指标说明: 此次皮皮侠分享数据主要构建了mangerpower、power这两个指标。这两大指标都是参考以下A类核心期刊(如经济研究、会计研究...
涉及了JSP编程、数据库系统、Web应用开发、Tomcat与Java Web、Servlet与JSP、JavaScript、信息安全体系以及Java编程等多个方面的书籍。 这个任务书不仅规定了项目的具体功能需求和技术要求,还强调了设计过程中的...
2. 借鉴Fan等(2009)、卢锐等(2008) 对管理层权力的间接度量方法,按照主成分分析方法将五个指标合成管理层权力综合指标; 3. pca因子分析; 4. KMO和SMC检验 数据范围: 1999-2018年;所有原始数据来自CSMAR数据库
在SQL Server中,使用`CREATE DATABASE`语句来创建一个新的数据库。脚本中的示例展示了如何指定数据文件和日志文件的名称、路径、初始大小、最大大小以及增长方式。例如: ```sql CREATE DATABASE usDB ON PRIMARY ...
文章末尾提到,尽管当今社会讲故事的机会和渠道增多,但好故事并不多,建议当代作家可以从古典名著中学习如何塑造人物、填充细节和赋予作品文化底蕴,以提升作品的审美空间和传世可能性。 总的来说,古典名著之所以...
matlab、maxdea多次重复测度拟合的最优结果,还希望大家多多支持。 投入 指标:劳动力投入、固定资产投资、能源消耗 产出指标:实际GDP(期望) 废水、S O2与烟尘(非期望) 模型设定:超效率SBM模型,产出导向 此外...
援鄂医护人员来自全国各地的医院,包括河北医科大学的多个附属医院和其他市级医院,他们中有经验丰富的专家,也有年轻的90后。他们在国家需要时,毫不犹豫地响应号召,奔赴前线。 在这些先进事迹中,我们可以看到:...