`
xgbjmxn
  • 浏览: 269809 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

引用 Hibernate多数据库访问问题

阅读更多
引用

     丬Bōer 的 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访问多个数据库的配置
    根据以上所述,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" 
    <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" 
    <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" 
    <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" 
    <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。
分享到:
评论

相关推荐

    Hibernate访问多个数据库

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

    基于hibernate的简单数据库实现

    这有助于优化性能,减少不必要的数据库访问。 10. **事务管理** Hibernate提供了一种便捷的事务管理方式,可以将多个数据库操作封装在一个Transaction中,保证原子性和一致性。 通过以上内容,我们了解了...

    Hibernate各种数据库关联annotatian和XML的配置集锦

    - 使用二级缓存:通过配置Hibernate的二级缓存,可以减少对数据库的访问,提高系统性能。 - HQL与SQL:使用HQL(Hibernate Query Language)可以更好地利用ORM的优势,但必要时也可以使用原生SQL进行性能优化。 5...

    HIBERNATE - 符合Java习惯的关系数据库持久化

    ### HIBERNATE - 符合Java习惯的关系数据库持久化:深入解析与实践 #### 一、概述 Hibernate是Java领域内最受欢迎的对象关系映射(ORM)框架之一,它简化了Java应用程序与关系型数据库之间的交互,使得开发人员...

    HibernateSpring多数据库解决方案.doc

    这样的设计既支持了读写分离,又简化了事务管理,是互联网应用中常见的一种数据库访问策略。在实际应用中,还需要根据业务需求,配置事务管理器、制定读写策略,并且可能需要处理如分库分表、数据库连接池等更复杂的...

    Hibernate 3.2反向生成数据库文件

    当与Hibernate结合使用时,可以构建出高效、灵活的数据访问层。 在反向生成数据库文件的过程中,首先你需要确保已安装并配置好Hibernate 3.2以及相应的JDBC驱动(对于SQL 2000,这通常是Microsoft的JDBC驱动)。接...

    hibernate一对多项目

    - 为提高性能,一对多关系默认采用懒加载,只有在真正访问集合时才会去数据库加载数据。若希望在获取父实体时同时加载子实体,可以设置`fetch = FetchType.EAGER`。 6. **缓存策略**: - Hibernate提供了一级缓存...

    hibernate多对多

    处理多对多关系时,考虑到N+1查询问题,可以使用`fetch`策略进行预加载,避免多次数据库访问。同时,合理使用缓存策略(一级缓存、二级缓存)能提升性能。 **六、总结** 通过Hibernate的多对多映射,开发者可以...

    hibernate 多对多映射实例,学生 选课

    总的来说,这个“hibernate 多对多 映射实例,学生 选课”项目涵盖了Hibernate的多对多关系映射、数据库设计、对象模型构建、事务管理等多个方面,是一个很好的学习和实践Hibernate的实战案例。通过深入理解和实践这...

    Hibernate需要注意的问题

    《Hibernate需要注意的问题与数据源配置详解》 在Java企业级开发中,Hibernate作为一种流行的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,使用Hibernate的过程中,开发者需要特别注意一些关键点,以...

    Hibernate多对多实现方式(多对多配置文件,数据库实现)

    本文将深入探讨如何在Hibernate中实现多对多关系,并通过配置文件和数据库实际操作来阐述这一过程。 首先,多对多关系在数据库设计中表示两个实体之间存在多个对应关系。比如,在学生和课程的关系中,一个学生可以...

    商城数据库hibernate映射实例

    Order类会包含对OrderLineItem(订单项)的引用,表示一个订单可以包含多个商品。 4. **订单项(OrderLineItem Entity)**:订单项表示订单中的每一件商品,包含商品ID、数量和单价。这需要创建OrderLineItem类和相应...

    hibernate多对一关联关系

    在Java的持久化框架Hibernate中,"多对一"关联关系是一种常见的对象关系映射(ORM)设计,它表示一个实体(子项)可以与多个其他实体(父项)相关联,而每个父项可能被多个子项引用。在数据库层面,这通常对应于一个...

    hibernate多对多关联映射(单项关联)

    总的来说,这篇博客和相关代码示例为开发者提供了一个理解和实现Hibernate中多对多单向关联的起点,帮助他们更好地处理复杂的数据库关系映射。学习和实践这部分内容对于提升Java后端开发能力,特别是使用Hibernate...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    hibernate3.0引用库

    6. **第二级缓存**:为了提高性能,Hibernate支持第二级缓存,它可以存储已加载的对象,减少对数据库的访问。常用的二级缓存提供商有Ehcache和Infinispan。 7. **事件监听器和拦截器**:Hibernate允许自定义事件...

    java JDBC与数据库访问PPT课件.pptx

    DBMS是数据库系统中各种操作的桥梁,允许多个应用程序同时访问数据库。 数据模型是数据库系统的基础,它定义了数据的逻辑结构。常见的数据模型有多种,如层次模型、网络模型和关系模型。其中,关系模型是最广泛使用...

    Hibernate电子书(全)

    延迟加载是一种优化技术,允许Hibernate在真正需要的时候才加载关联的对象,从而减少了不必要的数据库访问,提高了应用程序的性能。 #### Session管理 在Hibernate中,所有的数据操作都需要在一个Session的上下文中...

Global site tag (gtag.js) - Google Analytics