Hibernate工作原理

5 篇文章 0 订阅

Hibernate是一个开源框架,由Gavin King创建。它是采用ORM模式实现数据持久层的java组件。它提供了高效的、强大的将java对象进行数据持久化操作的服务。利用hibernate,开发人员可以按照java对象的结果进行持久层的开发,并可以完成java对象和关系型数据库之间的转换和操作。

 

 

hibernate的工作原理:

1)创建Configeration实例

根据它的构造方法将指定的配置信息(默认hibernate.cfg.xml)读到内存。一个Configeration 实例代表Hibernate 所有Java类到Sql数据库映射的集合。

 

2)创建SessionFactory实例

当使用Configeration实例创建了SessionFactory实例后,把Configeration 对象中的所有配置信息拷贝到SessionFactory的缓存中。SessionFactory的实例代表一个数据库存储源,创建后不在与Configeration 对象关联。SessionFactory是线程安全的,通常情况下,一个应用程序只有一个SessionFactory的实例。

 

3)创建Session实例

通过SessionFactory创建Session实例,session不是线程安全的,每个使用者应该用SessionFactory实例获得自己的session实例。获得session实例后就可以利用session的各种方法对对象进行持久化操作了。

 

4)创建Transaction事务

通过Session的beginTransaction()方法可以得到一个对象的实例。主要用于管理实务。一个事物对象可能会包括多个对数据库进行的操作。

 

Hibernate的作用:

1)Hibernate对JDBC进行了封装,实现了对象的持久化;

2)它实现了ORM(Object/Relation Mapping),提供了从 Java类到数据表的映射,也提供了数据查询和恢复等机制;

3)实现了连接池(一个等待数据库连接的队列);

4)操作数据库

 

hibernate的缓存:

为了提高系统性能,hibernate也使用了缓存机制。在hibernate框架中,主要包含两个方面的缓存,一级缓存和二级缓存。hibernate缓存的作用主要表现在以下两个方面: 1)通过主键(ID)加载数据的时候 2)延迟加载中。

 

一级缓存:hibernate的一级缓存是由session提供的,因此它只存在session的生命周期中。也就是说session关闭的时候该session所管理的一级缓存也随之被清除。hibernate的一级缓存是session所内置的,不能被卸载,也不能进行任何配置。一级缓存采用的是Key-Value的MAP方式来实现的。在缓存实体对象时,对象的主关键字ID是MAP的Key,实体对象就是对象的值。所以说一级缓存是以实体对象为单位进行存储的。访问的时候使用的是主键关键字ID。一级缓存使用的是自动维护的功能。但可以通过session提供的手动方法对一级缓存的管理进行手动干预。evict()方法用于将某个对象从session的一级缓存中清除。clear()方法用于将session缓存中的方法全部清除。

 

二级缓存:SessionFactory提供的缓存机制可以将缓存分为内置缓存和外置缓存。内置缓存存放了映射文件中数据的副本和预定义SQL语句。SessionFactory的外置缓存就是我们的二级缓存。它是一个可配置的插件,默认情况下SessionFactory不会启用这个插件,外置缓存的数据是数据库数据的副本。外置缓存的介质可以是内存或者硬盘。二级缓存的实现原理与一级缓存是一样的。也是通过Key-Value的Map来实现对对象的缓存。二级缓存是作用在SessionFactory范围内的。因此它比一级缓存的范围更广。它可被所有的Session对象所共享。需要注意的是放入缓存中的数据不能有第三方的应用对数据进行修改。

 

Hibernate的生命周期:

实体对象的生命周期主要存在三种不同状态:自由态、持久态和游离态。

 

自由态:表示该实体对象在内存中是自由自在的。与数据库中的数据没有任何关系。与session没有任何关系,也就是没有通过session的实例对其任何持久化的操作。

 

持久态:该实体对象处于hibernate框架所管理的状态。也就是说这个对象是与session的实体对象相关的。处于持久态的实体对象的特征就是其所作的任何的变更操作都将被Hibernate持久化到数据库中。我们可以说持久态的周期与其对应的session的周期息息相关的。hibernate会依据处于持久态的实体对象的属性变化而改变数据库中的对应记录。

 

游离态:处于持久态的实体对象,当不再与其对应的session对象相关联时,就处于游离态。

 

hibernate如何操作数据库:

1)Hibernate是如何连接数据库? 

主要是通过hibernate.cfg.xml配置文件中的配置。在这个文件中定义了数据库进行连接所需要的信息,包括JDBC驱动、用户名、密码、数据库方言等,configuration类借助dom4j的XML解析器解析设置环境,然后使用这些环境属性来生成SessionFactory。这样这个sessionFactory生成的session就能成功获得数据库的连接。  

 

2)Hibernate是如何进行数据库写操作?     

对数据库的写操作包括保存、更新和删除,当保存一个POJO持久对象时,触发Hibernate的保存事件监听器进行处理。Hibernate通过映射文件获得对象对应数据库表名以及属性所对应的表中的列名,然后通过反射机制持久化对象(实体对象)的各个属性,最终组织成向数据库插入新对象的SQL insert语句。调用了session.save()方法后,这个对象会标识成持久化状态存放在session中,对于Hibernate来说它就是一个持久化了的对象,但这个时候Hibernate还不会真正的执行insert语句,当进行session的刷新同部或事务提交时,Hibernate会把session缓存中的所有SQL语句一起执行,对于更新、删除操作也是采用类似的机制。

然后提交事务,待事务提交成功后,这些写操作就会被永久地保存进数据库中。所以,使用session对数据库操作还依赖于Hibernate事务的处理。如果设置了二级缓存,那么这些操作会被同步到二级缓存中,Hibernate对数据库最终操作也是依赖于底层JDBC对数据库进行。  

     

3)Hibernate如何从数据库中载入对象?   

当使用session.load()载入对象时,可以设置是否采用延迟加载,如果延迟加载,那么load返回的对象实际是CGLIB或javassist返回的代理类,它的非主键属性都是空的,这对于对象集合属性很有效。 Hibernate以此来节约内存,当真正需要读取对象时,Hibernate会先尝试从session缓存中读取,如果session缓存中数据不存在或者是脏数据并且配置了二级缓存,Hibernate尝试从二级缓存中检索数据,否则Hibernate会根据对象类型,主键等信息组织select语句到数据中读取,再把select结果组织成对象返回。  

   

4)Hibernate如何进行数据库查询操作?  

Hibernate提供SQL HQL Criteria查询方式。HQL是其中运用最广泛的查询方式。用户使用session.createQuery()方法以一条HQL语句为参数创建 Query查询对象后,Hibernate会使用Anltr库把HQL语句解析成JDBC可以识别的SQL语句,如果设置了查询缓存,那么执行 Query.list()时,Hibernate会先对查询缓存进行查询,如果查询缓存不存在,再使用select语句查询数据库。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值