`
xgbjmxn
  • 浏览: 262884 次
  • 性别: 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_3.2.0_符合Java习惯的关系数据库持久化

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

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    Hibernate+中文文档

    4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. ...

    hibernate3.2中文文档(chm格式)

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

    精通hibernate:对象持久化技术孙卫琴第二版part2

    数据访问代码负责把实体域对象持久化到关系数据库中。 2.1 直接通过JDBC API来持久化实体域对象 21 .2.2 ORM简介 27 2.2.1 对象-关系映射的概念29 2.2.2 ORM中间件的基本使用方法 31 2.2.3 常用的ORM中间件 33 ...

    HibernateAPI中文版.chm

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

    hibernate 3中的缓存小结

    当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象...

    第24次课-1 Spring与Hibernate的整合

    Spring提供了很多IoC特性的支持,方便处理大部分典型的Hibernate整合问题。 如:SessionFactory的注入、HibernateTemplate的简化操作、DAO的支持等。 为了更好地与持久层框架整合,Spring还提供了统一的异常处理体系...

    Hibernate中文详细学习文档

    4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. ...

    Hibernate 中文 html 帮助文档

    4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/...

    hibernate 教程

    为持久化字段声明访问器(accessors)和是否可变的标志(mutators) 4.1.2. 实现一个默认的构造方法(constructor) 4.1.3. 提供一个标识属性(identifier property)(可选) 4.1.4. 建议使用不是final的类 ...

    最全Hibernate 参考文档

    4.1.1. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators) 4.1.2. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.3. 提供一个标识属性(identifier property)(可选) 4.1.4. 使用非final...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate教程

    5.1.1. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators) 5.1.2. 实现一个默认的(即无参数的)构造方法(constructor) 5.1.3. 提供一个标识属性(identifier property)(可选) 5.1.4. 使用非...

    hibernate精华教程

    如果应用同时访问多个DB,怎需要为每个数据库创建一个单独的SessionFactory实例。 (3)Session:也被称为持久化管理器,对象级数据库操作。 特点: 1)不是线程安全的,因此在设计软件架构时,应该避免多个线程共享...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    javaee 实验报告 实验一 JSP+Servlet+Javabean+jdbc-基于MVC模式的数据库的应用

    javaee 实验报告 实验一 JSP+Servlet+Javabean+jdbc-基于MVC模式的数据库的应用 实验二 JSF+JPA实现用户注册 实验三 struts+spring+hibernate框架访问数据库的应用 实验四 使用WebService和EJBean访问数据库的应用

Global site tag (gtag.js) - Google Analytics