Hibernate核心接口和工做原理

                                                   Hibernate核心接口和工做原理html

Hibernate有五大核心接口,分别是:Session 、Transaction 、Query 、SessionFactory 、Configuration 。这五个接口构成了Hibernate运行的基本要素,能够执行存取,持久化,事务管理等操做。这五个接口能够位于系统的业务逻辑层和持久化层。下面是一张Hibernate的关系图:java

 

 

      (1)SessionFactory这是Hibernate的关键对象,它是单个数据库映射关系通过编译后的内存镜像,它也是线程安全的它是生成Session的工厂,自己要应用到ConnectionProvider,该对象能够在进程和集群的级别上,为那些事务之间能够重用的数据提供可选的二级缓存。数据库

      (2)Session:它是应用程序和持久存储层之间交互操做的一个单线程对象。它也是Hibernate持久化操做的关键对象,全部的持久化对象必须在Session的管理下才可以进行持久化操做。此对象的生存周期很短,其隐藏了JDBC链接,也是Transaction 的工厂。Session对象有一个一级缓存,现实执行Flush以前,全部的持久化操做的数据都在缓存中Session对象处。缓存

      (3)持久化对象:系统建立的POJO实例一旦与特定Session关联,并对应数据表的指定记录,那该对象就处于持久化状态,这一系列的对象都被称为持久化对象。程序中对持久化对象的修改,都将自动转换为持久层的修改。持久化对象彻底能够是普通的Java Beans/POJO,惟一的特殊性是它们正与Session关联着。安全

      (4)瞬态对象和脱管对象:系统进行new关键字进行建立的Java 实例,没有Session 相关联,此时处于瞬态。瞬态实例多是在被应用程序实例化后,还没有进行持久化的对象。若是一个曾今持久化过的实例,但由于Session的关闭而转换为脱管状态。session

      (5)事务(Transaction):表明一次原子操做,它具备数据库事务的概念。但它经过抽象,将应用程序从底层的具体的JDBC、JTA和CORBA事务中隔离开。在某些状况下,一个Session 以内可能包含多个Transaction对象。虽然事务操做是可选的,可是全部的持久化操做都应该在事务管理下进行,即便是只读操做。app

      (6)链接提供者(ConnectionProvider):它是生成JDBC的链接的工厂,同时具有链接池的做用。他经过抽象将底层的DataSource和DriverManager隔离开。这个对象无需应用程序直接访问,仅在应用程序须要扩展时使用。ide

      (7)事务工厂(TransactionFactory):他是生成Transaction对象实例的工厂。该对象也无需应用程序的直接访问。ui

  Hibernate进行持久化操做离不开SessionFactory对象,这个对象是整个数据库映射关系通过编译后的内存镜像,该对象的openSession()方法可打开Session对象。SessionFactory对想是由Configuration对象产生。this

每一个Hibernate配置文件对应一个configuration对象。在极端状况下,不使用任何配置文件,也能够建立Configuration对象。


Session接口:

Session接口 Session 接口对于Hibernate 开发人员来讲是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,建立和销毁它都不会占用不少资源。这在实际项目中确实很重要,由于在客户程序中,可能会不断地建立以及销毁Session对象,若是Session 的开销太大,会给系统带来不良影响。可是Session对象是非线程安全的,所以在你的设计中,最好是一个线程只建立一个Session对象。 session能够看做介于数据链接与事务管理一种中间接口。咱们能够将session想象成一个持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及时刷新数据库。咱们有时也称Session是一个持久层管理器,由于它包含这一些持久层相关的操做, 诸如存储持久对象至数据库,以及从数据库从得到它们。须要注意的是,Hibernate的session不一样于JSP 应用中的HttpSession。当咱们使用session这个术语时,咱们指的Hibernate 中的session,而咱们之后会将HttpSesion 对象称为用户session。

 

SessionFactory接口:

SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责建立Session对象。这里用到了工厂模式。须要注意的是SessionFactory并非轻量级的,由于通常状况下,一个项目一般只须要一个SessionFactory就够,当须要操做多个数据库时,能够为每一个数据库指定一个SessionFactory。

 

Transaction接口

Transaction接口负责事务相关的操做,通常在Hibernate的增删改中出现,可是使用Hibernate的人通常使用Spring去管理事务。

 

Query接口

Query负责执行各类数据库查询。它可使用HQL语言或SQL语句两种表达方式。它的返回值通常是List。须要本身转换。

 

Configuration接口:

Configuration对象用于配置并根启动HibernateHibernate应用经过Configuration实例来指定对象关系映射文件的位置或者动态配置Hibernate的属性,而后建立SessionFactory实例。咱们能够查看Configuration的源代码,它的configure()方法是这样实现的:

 

  1. public Configuration configure() throwsHibernateException {  
  2.        configure("/hibernate.cfg.xml" );//此处指定了ORM文件的位置  
  3.        return this;  
  4.    }  

 

咱们看到它是在这里指定了ORM文件的位置,这就是为何Hibernate老是默认到classpath下去寻找hibernate.cfg.xml文件的缘由了。实际上咱们还能够经过configure(String resource)来动态的指定配置文件,只不过一般咱们都是采用的默认设置罢了。这样的话咱们的配置文件就都被读取了,同时配置文件中经过<mapping>元素引入的映射文件也被读取了。

 

Hibernate运行过程:

1.经过Configuration().configure();读取并解析hibernate.cfg.xml配置文件

2.由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>读取并解析映射信息

3.经过config.buildSessionFactory();//建立SessionFactory

4.sessionFactory.openSession();//打开Sesssion

5.session.beginTransaction();//建立事务Transation

6.persistent operate持久化操做 //通常指Save这个方法

7.session.getTransaction().commit();//提交事务

8.关闭Session

9.关闭SesstionFactory

hibernate.properties和hiberntae.cfg.xml文件

        若是使用etc路径下的hibernate.properties文件做为配置文件的模板,修改此模板文件做为Hibernate配置文件,这种方式的确是快速进入Hibernate开发的方法。可是对于实际开发,一般会使用hibernate.cfg.xml文件做为配置文件。

深刻对比hibernate.properties和hibernate.cfg.xml文件后看以下的hibernate.properties的一个配置属性:

<span style="font-family:SimSun;font-size:14px;">//指定数据库的方言
hibernate.dialect org.hibernate.dialect.MySQLDialect</span>

上面的一行代码是典型的Properties文件的的格式,前面的key为hibernate.dialect , 后面的value是为org.hibernate.dialect.MySQLDialect。

接下来咱们再来查看hibernate.cfg.xml文件中的相对应的配置代码:

<span style="font-family:SimSun;font-size:14px;"><property name = "dialect">org.hibernate.dialect.MySQLDialect</property></span>

一样指定了Hibernate的Dialect 属性是org.hibernate.dialect.MySQLDialect 。对比两种格式的文件,能够发现虽然格式不一样但其实质彻底同样。

相关文章
相关标签/搜索