`

没有spring时sessionFactory 会话工厂的建立

阅读更多

Hibernate访问数据库时加载的过程

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

Hibernate中,Configurationhibernate的入口。在实例化一个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.propertieshibernate.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,多数据库就更简单了,像这段代码可以完成所有配置:

 
  
jdbc:mysql://localhost:3306/test
  
org.gjt.mm.mysql.Driver
  
root
  
123
 
 

  
 
   org.hibernate.dialect.MySQLDialect
 
  
 
test.hbm.xml
 
 
 

  
jdbc:odbc:test
  
sun.jdbc.odbc.JdbcOdbcDriver
  
root
  
123
 
 

  
 
   org.hibernate.dialect.SQLServerDialect
 
  
 
test.hbm.xml
 
 
 
.......



以上只是配置Hibernate访问多个数据库的一般方法,hibernate还有很多可行的配置,有兴趣的读者可以参考它的reference

分享到:
评论

相关推荐

    SSH整合中 hibernate托管给Spring得到SessionFactory

    SessionFactory中 加入为了能得到同一个Session”表明本文要讨论的是在使用Spring框架整合Hibernate时,如何实现Spring管理Hibernate的SessionFactory对象,以便能够共享同一个数据库连接会话。 SSH框架指的是...

    Spring-session2整合spring5+redis

    标题中的“Spring-session2整合spring5+redis”指的是在Spring框架的第五个主要版本(Spring 5)中,集成Spring Session 2与Redis数据库来管理Web应用的会话(Session)。Spring Session是一个开源项目,旨在提供一...

    Spring源代码解析(八):Spring驱动Hibernate的实现.doc

    这个方法是创建`SessionFactory`的核心,它会根据配置信息来构建Hibernate的会话工厂。 首先,`buildSessionFactory()`方法创建了一个`Configuration`实例,这是Hibernate配置的基础。接着,如果提供了数据源(`...

    SessionFactory.getCurrentSession与openSession的区别

    `SessionFactory` 的主要职责是根据ORM(对象关系映射)配置生成对应的SQL语句,它是数据库连接的会话工厂。 然后,我们来看 `Session`。`Session` 是Hibernate中的工作单元,代表了与数据库的一次交互会话。它负责...

    spring与hibernate的整合

    这样,Spring 会在调用 `addDepartment()` 方法时自动开启、提交或回滚事务,无需在业务代码中手动管理。 总结来说,Spring 与 Hibernate 的整合主要涉及 SessionFactory 的配置、DAO 类的实现以及事务管理。通过 ...

    struts2+Spring2.5+Spring3.2)实现登录.

    - **会话工厂配置**:在创建Hibernate会话工厂时,选择不要创建sessionFactory类,而是利用Spring来管理。 #### 三、业务逻辑实现 ##### 1. ORM、交互值对象与DAO层设计 - **ORM映射文件与持久化类**:在`...

    新Hibernate SessionFactory().getCurrentSession()猫腻

    在Hibernate中,SessionFactory是持久化会话的主要工厂对象,而getCurrentSession()方法则提供了一种便捷的方式来获取当前线程绑定的Session实例。这个方法在很多情况下被推荐使用,因为它可以自动处理事务的开启、...

    spring+hibernate解决多数据源问题3.pdf

    在Hibernate框架中,会话工厂(SessionFactory)是用于管理Hibernate会话的工厂类,是Hibernate进行数据库操作的核心组件。 知识点二:Spring与Hibernate整合的配置 在Spring+Hibernate的整合模式下,通常会在...

    Spring中使用Hibernate

    接下来,配置Spring的Hibernate会话工厂。在Spring的配置文件(如`applicationContext.xml`)中,我们需要定义`LocalSessionFactoryBean`,指定Hibernate的配置文件和实体类的路径。 ```xml <bean id="...

    spring整合hibernate所用相关jar包

    2. **配置Spring**:在Spring配置文件中,定义DataSource(数据源)、SessionFactory(会话工厂)和TransactionManager(事务管理器)。DataSource连接到数据库,SessionFactory用于创建和管理Hibernate的Session...

    spring.net+Nhiberate实现WCF服务层

    在项目中,我们需要创建一个配置文件(如:Spring.config),定义服务接口和服务实现的bean,以及NHibernate会话工厂的配置。例如: ```xml <objects xmlns="http://www.springframework.net"> <object id="...

    Spring.Net,Nhibernate多数据库操作

    Spring.Net的依赖注入机制使得可以根据运行时条件动态选择SessionFactory。例如,你可以创建一个接口`IDatabaseService`,并实现多个具体服务类,每个类对应一个数据库: ```csharp public interface ...

    spring整合hibernate的jar包

    1. **hibernate-core-4.2.4.Final.jar**:这是Hibernate的核心库,包含ORM的主要功能,如实体管理、会话工厂、查询API等。 2. **com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar**:AspectJ是一个强大的AOP...

    Spring.Net结合NHibernate完整代码

    SessionFactory是NHibernate中的核心组件,负责管理与数据库的会话。在Spring.NET配置文件中,通常会定义一个SessionFactoryBean,配置数据库连接信息、映射文件路径等,然后在需要的地方通过依赖注入获取...

    Spring.Net2.0.1+Nhibernate4

    Spring.NET通过其IoC( inversion of control)容器,使得配置和管理NHibernate会话工厂变得简单。开发者可以定义一个或多个SessionFactory Bean,通过依赖注入的方式将它们注入到需要使用ORM的地方。这样,不仅能够...

    Spring集成Hibernate所需jar包

    - Hibernate核心:`hibernate-core.jar`,包含Hibernate ORM的主要功能,如实体管理、会话工厂、查询API等。 - Hibernate注解:`hibernate-annotations.jar`,提供Java 5+的注解支持,简化实体类的配置。 - ...

    spring技术手册demo

    你将学习如何配置Hibernate SessionFactory,使用Spring的HibernateTemplate或SessionFactoryBean来管理Hibernate会话。此外,还会讲解如何在Spring中实现事务管理,以确保数据的一致性和完整性。 通过这五个章节的...

    some simple demo about hibernate3.2 and spring2.5

    5. **SessionFactory和Session**:SessionFactory是线程安全的,负责创建Session实例,Session是数据库操作的会话单位。 **Spring 2.5 知识点**: 1. **依赖注入(DI)**: Spring通过XML配置或注解实现组件之间的...

    spring整合其他框架

    Spring支持Hibernate的事务管理、DAO(数据访问对象)工厂,以及SessionFactory的创建,简化了数据库访问,降低了耦合度。 9. Spring与JPA整合:Java Persistence API(JPA)是Java平台上的标准ORM规范。Spring与...

Global site tag (gtag.js) - Google Analytics