Hibernate配置相关的类
Configuration类(负责管理Hibernate的配置信息)
当创建SessionFactory时,Configuration实例可以指定使用哪一个映射文档。应用程序通常只是创建一个Configuration实例,并通过它创建一个SessionFactory实例。
当客户端发送一个请求线程时,SessionFactory初始化一个Session。 Configuration是Hibernate的入口,在新建一个Configuration的实例时,Hibernate会在classpath中查找hibernate.propertise文件,如果该文件存在,则将该文件的内容加载到内存中;如果不存在则抛出异常。Configure()方法默认会在classpath下面寻找hibernate.cfg.xml文件,如果没有找到该文件,系统会打印信息并抛出HibernateExcelption异常;如果找到该文件,configure()方法会首先访问,并获取该元素的name属性;如果非空,则将用这个配置信息来覆盖hibernate.propertise的hibernate.session_factory_name的配置值。
SessionFactory类(负责创建Session实例)
为了能创建一个SessionFactory对象,必须在Hibernate初始化时创建一个Configuration类的实例,并将已写好的映射文件交由它处理。这样,Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就可以简单的抛弃他。
SessionFactory sessionFactory = Configuration().configure().buildSessionFactory();
SessionFactory是线程安全的,可以被多线程调用已取得Session,而且构造SessionFactory很消耗资源,多以多数情况下只是初始化一个SessionFactory,为不同的Session提供实例。
Session类
Session是Hibernate运作的中心,对象的生命周期,事务的管理,数据库的存取都与Session息息相关。
虽然SessionFactory是线程安全的,但是Session不是。HibernateUtil中使用ThreadLocal可以有效隔离执行所使用的资源,所以避开了Session的多线程之间的数据共享问题。
Hibernate中的缓存分为两种:一级缓存(Session级别),二级缓存(SessionFactory级别)
Session的作用:
(1) 充当蓄水池的作用,减少程序访问数据库的次数。当应用程序需要使用对象时,现在本session的缓存内查找,如果有此对象,则直接返回应用程序;如果没有,则发送SQL语句到数据库中查询,将记录的字段值组装成对象后存于Session中,以供应程序调用。
(2) 保证缓存中的数据与数据库同步。 清理缓存:是指查看缓存中的数据与数据库是否同步,如果缓存数据与数据库不一样,则发送更新语句把缓存数据和数据库同步;如果一样,则不作操作。
FlushMode有以下几种:
(1) FlushMode.AUTO:Hibernate判断对象属性有没有更改,如果被更改过变成了脏数据,则在一个查询语句前将更新此改动以保证同步数据库;如果对象没有被改动,则在查询语句之前不用更新数据。这是默认的清理模式
(2) FlushMode.COMMIT:在事务结束之前清理session的缓存,其他任何时候都不清理缓存。这样的设置将有可能使查出来的数据时脏数据。
(3) FlushMode.NEVER:除非强制调用Session.flush(),否则永不清理缓存。这时候对数据库所做的修改只是限于内存,不会同步到数据库,数据库的数据相当于只是读数据。
(4) FlushMode.ALWAYS:在每一个查询语句前都调用flush()进行缓存清理。这种模式是不必要的,而且是低效的。