应用Hibernate时,经常会访问Hibernate的Configuration、SessionFactory、Session、Transaction、Query和Criteria等核心接口,使用这些接口,可以存储与取出持久化对象或者对事物进行控制。
首先从Hibernate的工作原理开始
Hibernate的初始化
1.读取Hibernate的配置信息--Configuration接口
Configuration的构造方法,将配置信息(Hibernate.cfg.xml)读入到内存中一个Configuration实例代表Hibernate所有Java类到SQL数据库映射的集合。
Configuration类时Hibernate的入口,负责在HIbernate初始化是加载默认文件路径下的配置文件信息(hibernate.properties或hibernate.cfg.xml)到内存,并通过他的对象加载指定的映射文件到内存。虽然Configuration接口在整个项目中只扮演一个很小的角色,但它是启动hibernate时的第一个对象,我们也可以自定义配置文件的位置
Configuration cfg = new Configuration().configure(“hibernate.xml”);
2.创建SessionFactory实例---SessionFactory接口
读取完配置信息之后,就是把Configuration对象中所有配置信息拷贝到SessionFactory的缓存中,SessionFactory的实例代表一个数据库存储源,创建后不再与Configuration对象关联。
SessionFactory负责创建Session实例,每个SessionFactory类的实例对应一个数据库,SessionFactory实例是重量级的(因为它占用缓存比较大),它占用很大的缓存,用来存放预定义的SQL语句和映射元数据等,所以每个数据库最后只创建一个SessionFactory实例,在初始化完成后,它的线程是安全的,可以多线程共享。
3.调用SessionFactory创建Session—Session接口
(1).SessionFactory提供连接:
Session session = sessionFactory.openSession();
(2).用户自行提供JDBC连接
Connection conn = DataSource.getConnection();
Session s = sessionFactory.openSession();
Session是Hibernate持久化操作的基础,它负责管理所有与持久化相关的操作,例如数据库的存取、事务的管理和对象的生命周期等,Session它不是线程安全的,应避免多个线程共享同一个Session,它占用的缓存很少(轻量级的),创建和销毁不会浪费太多的资源,我们可以将Session想象成一个持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及时刷新到数据库。
(3).每个Session实例和一个数据库事务绑定—Transaction接口
通常将一个Session实例和一个数据库事务绑定,也就是说,每执行一个数据库事务操作,就应该创建一个session。
Transaction负责Hibernate的数据库事务,其实Hibernate本身并不具有管理事务的能力,知识对底层事务接口进行了封装,对实际事务的一个抽象,这样做有利于开发者能够使用一个统一的事务操作界面,使得自己项目在不同环境或容器中移植,也可以直接访问底层的事务接口,但是不利于移植。
4.通过Session接口提供的各种方法来操作数据库访问—Query和Criteria接口
Query和Criteria接口负责hibernate的查询操作
Query实例封装了一个HQL(hibernate query language)查询语句,HQL是面向对象的,它操作的是持久化类的类名和该类的属性名,而SQL操作的是表名和字段名。
Criteria实例完全封装了字符串形式的查询语句,更适合执行动态查询。
(1).临时状态 (transient) ,通过new语句刚创建一个对象时当调用Session 的delete()方法,从Session 缓存中删除一个对象时。不处于Session 缓存中,数据库中没有对象记录。
(2).持久化状态(persisted)
Session 的save()把临时-》持久化状态
Session 的load(),get()方法返回的对象
Session 的find()返回的list集合中存放的对象
Session 的update(),saveOrupdate()使游离-》持久化
处于Session 缓存中,持久化对象数据库中设有对象记录,Session 在特定时刻会保持二者同步
(3).游离状态(detached) ,Session 的close()方法,Session 的evict()方法,从缓存中删除一个对象。提高性能。少用。
不再位于Session 缓存中,游离对象由持久化状态转变而来,数据库中可能还有对应记录。