前边我们详细的讲述了一个Hibernate的HelloWorld的程序的具体的内容:一个持久化类(必须带有无参构造器用于反射创建对象,setter/getter方法,标识主键的属性,非final的类和属性,重写equals和hashcode方法用于向Session的集合性质的缓存中存放类的对象);对象关系映射文件(注意id);Hibernate的映射文件(连接数据库和Hibernate的其他的属性以及加载Mapping映射文件,注意生成数据表的策略这个属性的四种策略hbm2ddl.auto);通过Hibernate提供的API访问数据库(Configuratioin对象,ServiceRegistry对象,SessionFactory对象,Session对象,Transaction对象)。
前边我们讲过了Configuration这个对象相当于代表了一个Hibernate的配置文件,ServiceRegistry相当于Hibernate4的一个新的接口,所有的基于Hibernate的配置或者服务都必须向这个接口进行注册才可以使用,SessionFactory相当于一个和单个数据库建立连接的映射的镜像,用来创建Session对象;Transaction是HIbernate进行数据库操作之前必须要开启的事务对象,若不开启则操作数据库的内容是失败的,无效的。那么今天,我们来好好的讲一讲Session这个对象及其具有的缓存的功能。
1.Session概述
① Session接口数Hibernate提供的操作数据库的最主要的接口,这个接口中有一系列更新,删除,保存和加载(根据唯一的UID将数据记录转换为对象到内存中)的方法。
② Seesion的对象具有一个一级的缓存,位于一级缓存中的对象称之为持久化的对象(这些对象和数据库中的一些记录一一对应)。Session可以在某些时间点按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一个过程称之为刷新缓存。
2.Session缓存
① Session接口的实现类中包含一系列的Java的集合,这些Java的集合构成了Session缓存,只要Session的实例还没有结束生命周期,且没有清理缓存,那么这个Session对象中的缓存中的对象也不会结束生命周期,哪怕没有任何变量引用这些位于缓存中的持久化的对象。
② Session缓存的功能
Session缓存可以有效的减少HIbernate应用程序访问数据库的频率。因为它可以从缓存中拿取数据,而不必再从数据库中拿取数据。
③ Session实例对象的方法
flush():刷新缓存的方法。主要目的是强制性的将数据库中的数据记录和Session缓存中的对象保持一致。因为我们可能会操作Session缓存中的对象,所以一旦这些对象发生了变化,那么数据库中的数据记录就会和之前对应的对象不一致了,所以我们需要使用flush()方法刷新一下缓存。
flush()方法的使用场景:
一是在调用事务的commit()方法的时候,在真实的调教事务之前会调用一次session.flush()的方法来刷新Session的缓存。
二是可以在编写的代码中手动的刷新一下缓存。
三是当我们使用HQL或者QBL查询时,因为要求查到的对象是最新的,所以也会执行一次flush()的方法。
refresh();这个方法会强制性的发出查询语句使得Session缓存中的对象和数据库中的记录保持一致。
需要注意的是,使用这个方法前必须查看数据库针对事务的隔离级别是什么,我们必选将数据库的隔离级别设置成读已提交的即2--read_commited才可以使refresh()方法生效。MySql默认数据库隔离级别是repeatable_read(可重复读),Oracle数据库的默认隔离级别是read_commited
clear():顾名思义,就是清除Session实例中的缓存对象。