Hibernate参考文档学习笔记——Hibernate入门(三)
每个人都有潜在的能量,只是很容易被习惯所掩盖,被时间所迷离,被惰性所消磨。
今天的学习任务就是Hibernate的体系结构,了解Hibernate是如何组织的。
1、概述
首先看一下简要的Hibernate体系结构图:
从图中可知,Hibernate是通过配置文件将数据库信息转换成持久化对象来为应用程序提供持久化服务的,可以采用两种配置文件的形式,.properties文件或.xml文件,可以根据个人喜好选择不同的形式,建议使用xml文件。
Hibernate使用灵活,支持多种应用方案,这里简述两种极端情况,“轻型”解决方案和“全面”解决方案。
1.1“轻型”解决方案
这种方案需要应用程序提供自己的JDBC连接并进行事务的管理,仅仅用到了Hibernate API的最小子集。
1.2“全面”解决方案
这种解决方案则是由Hibernate来替我们处理细节问题,将应用层从底层的JDBC/JTA API中抽象出来。
SessionFactory (org.hibernate.SessionFactory)
用于生成Session的工厂,本身要用到ConnectionProvider。 该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。
Session (org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。 其隐藏了JDBC连接,也是Transaction的工厂。 其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。
持久的对象及其集合
带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。 这些对象可能是普通的JavaBeans/POJO,唯一特殊的是他们正与(仅仅一个)Session相关联。 一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。
瞬态(transient)和脱管(detached)的对象及其集合
那些目前没有与session关联的持久化类实例。 他们可能是在被应用程序实例化后,尚未进行持久化的对象。也可能是因为实例化他们的Session已经被关闭而脱离持久化的对象。
事务Transaction (org.hibernate.Transaction)
(可选的)应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。 它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。某些情况下,一个Session之内可能包含多个Transaction对象。尽管是否使用该对象是可选的,但无论是使用底层的API还是使用Transaction对象,事务边界的开启与关闭是必不可少的。
ConnectionProvider (org.hibernate.connection.ConnectionProvider)
(可选的)生成JDBC连接的工厂(同时也起到连接池的作用)。它通过抽象将应用从底层的Datasource或DriverManager隔离开。仅供开发者扩展/实现用,并不暴露给应用程序使用。
TransactionFactory (org.hibernate.TransactionFactory)
(可选的)生成Transaction对象实例的工厂。仅供开发者扩展/实现用,并不暴露给应用程序使用。
扩展接口
Hibernate提供了很多可选的扩展接口,你可以通过实现它们来定制你的持久层的行为。
2、实例状态
在Hibernate中,一个对象实例可能处于三种不同状态中的一种,这三种状态分别是瞬态(Transient)、持久态(Persistent)、脱管(Detached)。
- 瞬态
该状态的对象实例在数据库中还没有对应的主键关联记录。
- 持久态
该状态的对象实例在数据库中有对应的主键关联记录,并且处于Session的管理中,对该状态下的对象实例的操作在事务提交时直接反应到数据库的对应记录中。
- 脱管
该状态的对象实例在数据库中也有对应的主键关联记录,但是管理该对象实例的Session已经关闭或者这个实例已经被序列化到另外的进程。