Hibernate基础之(二)Hibernate 体系结构
Hibernate是一个开源的ORM(对象/关系映射)数据持久层框架,它对JDBC进行了轻量级封装,使Java程序可以像操作数据对象那样访问关系型数据库,以完全面向对象的思维和方式完成数据库的CRUD操作,可以编写SQL语句,也可以不关注数据表和具体字段,而是使用Hibernate框架自定义的HQL语言,以操作数据持久化对象和属性来实现数据库访问。
Hibernate框架封装了JDBC、JTA(Java Transaction API)和JNDI(Java Naming And Directory Interface,Java命名与目录接口),JDBC提供了底层数据库访问操作,JNDI和JTA使Hibernate框架可以和JavaEE应用服务器集成。常见的应用模式如下:
Hibernate体系结构图:
核心配置文件hibernate.cfg.xml对应一个Configuration对象,主要包含三部分内容:
(1)Hibernate框架与数据库之间的连接信息,数据库/数据库连接池的连接属性(例如:driver、url、user、password等)。
(2)Hibernate框架的基本属性,例如:是否在控制台输出SQL命令、数据库使用的方言、本地线程与Session对象绑定、是否自动创建数据表等。
(3)持久化对象映射文件的名称与位置。
*.hbm.xml是持久化对象映射文件,一般每一个持久化类对应一个hbm.xml映射文件,用于配置数据持久化类与数据表、属性与字段之间的对应关系。也可以将多个数据持久化类配置在一个hbm.xml文件中。
Hibernate框架将用户从最基础的JDBC访问中释放出来,使用户不再关注底层JDBC操作,而是以面向对象的方式进行数据持久层操作,底层数据库连接对象的获得、数据CRUD操作、事务访问控制都交给Hibernate框架处理。Hibernate全面解决方案体系架构如下:
1、SessionFactory是Hibernate框架的重要对象,它是单个数据库映射关系经过编译后的内存镜像,可以充当数据源的代理(可以理解为SessionFactory对象中有一个DataSource数据源对象),是管理Session对象的机构,创建Session对象(Session对象可以理解为JDBC中的Connection数据库连接对象)的工厂。一个应用程序一般只需要创建一个SessionFactory对象,除非这个应用需要操作多个数据库,才会为每个数据库创建一个SessionFactory对象。
SessionFactory对象必须是线程安全的,它的生命周期伴随整个应用,从它创建以后,直到应用程序结束,SessionFactory对象才会销毁。
在一个应用中,SessionFactory对象只需要创建一次,一般在应用启动时创建SessionFactory对象,然后就可以在整个程序运行过程中使用这个对象了。
2、Session是Hibernate框架与数据库之间进行交互的单线程对象,类似于JDBC中的Connection对象,所有的数据持久化对象都必须在Session对象的管理下才能进行CRUD操作。Session对象也是Transaction对象的工厂,Transaction对象是由Session对象创建的,数据的CRUD操作在一个事务中进行。Session对象还有一个一级缓存和数据快照区,一级缓存用于存储持久化操作的数据,数据快照区存储数据库提取出来的原始数据。
3、持久化对象是Hibernate框架用来完成数据持久化操作的对象,一个数据持久化对象是数据持久化类的一个实例,数据持久化类常常称为“实体Bean”,它是POJO(普通JavaBean)与映射文件的结合,即:PO = POJO + 映射文件。一个数据持久化类对应底层数据库中的一张数据表,类中的属性对应数据表中的字段。Hibernate框架是通过数据持久化对象在Session的管理下,实现数据库CRUD操作的。
根据持久化对象是否处于Session管理中与是否具有id键值,可以将对象的状态定义为三类:
(1)瞬态:使用new关键字创建了数据持久化对象,但该对象还没有处于Session管理之中,不具有相关的id主键值,与Session对象还不存在任何关联,这样的持久化对象是“瞬态(临时状态)”的数据对象。
(2)持久态:Session对象通过save()、update()、get()等方法将持久化对象加入到了Session的一级缓存中,使数据持久化对象与Session对象发生了关联,持久对象就处于Session的管理之中,并具有了id主键值,这样的持久化对象是“持久态”的数据对象。
(3)脱管态:当Session对象关闭后,原本处于“持久状态”的数据对象就脱离了Session的管理,但它仍然具有id主键值,这样的数据持久化对象是“脱管状态”的数据对象。
4、事务(Transaction)是数据库中最小的工作单元,一个事务中的所有SQL命令被当作一个整体对待,要么全部执行,要么一个都不执行。Hibernate框架封装了底层的JDBC Transaction和JTA(Java Transaction API)Tranasction,并在外面套上了Transaction和Session外壳,通过委托底层的JDBC和JTA来实现事务功能。
如果要在Hibernate中使用事务,可以通过在核心配置文件hibernate.cfg.xml中配置使用JDBC Transaction还是使用JTA Transaction;若没有配置,默认使用JDBC Transaction。
在默认的JDBC Transaction事务管理模式中,每一个SQL命令就是处于一个独立的事务中,当一条SQL命令执行完成以后,事务都会以“提交/回滚的方式”结束;若还有新的SQL命令要执行,将会开启另一个新的事务。
在Hibernate框架中,通过Session对象的beginTransaction()方法开启一个新的事务时,底层就会自动调用JDBC的setAutoCommit(false)方法设置事务提交模式为“手动事务模式”,于是,通过Session对象完成了数据库CRUD操作以后,必须通过Transaction对象的commit()或rollback()方法手动结束事务。
5、事务工厂(Transaction Factory)是生成Transaction对象实例的工厂,该对象无需应用程序直接访问。
6、连接提供者(Connection Provider)是生成JDBC连接的工厂,具有数据库连接池的作用,对底层DataSource和DriverManager的功能进行了封装,该对象无需应用程序直接访问。