【原创】Hibernate基础之(二)Hibernate 体系结构

2020-07-31 15:10发布

Hibernate基础之(二)Hibernate 体系结构


Hibernate是一个开源的ORM(对象/关系映射)数据持久层框架,它对JDBC进行了轻量级封装,使Java程序可以像操作数据对象那样访问关系型数据库,以完全面向对象的思维和方式完成数据库的CRUD操作,可以编写SQL语句,也可以不关注数据表和具体字段,而是使用Hibernate框架自定义的HQL语言,以操作数据持久化对象和属性来实现数据库访问。

Hibernate框架封装了JDBCJTAJava Transaction API)和JNDIJava Naming And Directory InterfaceJava命名与目录接口),JDBC提供了底层数据库访问操作,JNDIJTA使Hibernate框架可以和JavaEE应用服务器集成。常见的应用模式如下:



Hibernate体系结构图:

 

核心配置文件hibernate.cfg.xml对应一个Configuration对象,主要包含三部分内容:

(1)Hibernate框架与数据库之间的连接信息,数据库/数据库连接池的连接属性(例如:driverurluserpassword等)。

(2)Hibernate框架的基本属性,例如:是否在控制台输出SQL命令、数据库使用的方言、本地线程与Session对象绑定、是否自动创建数据表等。

(3)持久化对象映射文件的名称与位置。

*.hbm.xml是持久化对象映射文件,一般每一个持久化类对应一个hbm.xml映射文件,用于配置数据持久化类与数据表、属性与字段之间的对应关系。也可以将多个数据持久化类配置在一个hbm.xml文件中。

Hibernate框架将用户从最基础的JDBC访问中释放出来,使用户不再关注底层JDBC操作,而是以面向对象的方式进行数据持久层操作,底层数据库连接对象的获得、数据CRUD操作、事务访问控制都交给Hibernate框架处理。Hibernate全面解决方案体系架构如下:


 

1SessionFactoryHibernate框架的重要对象,它是单个数据库映射关系经过编译后的内存镜像,可以充当数据源的代理(可以理解为SessionFactory对象中有一个DataSource数据源对象),是管理Session对象的机构,创建Session对象(Session对象可以理解为JDBC中的Connection数据库连接对象)的工厂。一个应用程序一般只需要创建一个SessionFactory对象,除非这个应用需要操作多个数据库,才会为每个数据库创建一个SessionFactory对象。

SessionFactory对象必须是线程安全的,它的生命周期伴随整个应用,从它创建以后,直到应用程序结束,SessionFactory对象才会销毁。

在一个应用中,SessionFactory对象只需要创建一次,一般在应用启动时创建SessionFactory对象,然后就可以在整个程序运行过程中使用这个对象了。

 

2、SessionHibernate框架与数据库之间进行交互的单线程对象,类似于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 TransactionJTAJava Transaction APITranasction,并在外面套上了TransactionSession外壳,通过委托底层的JDBCJTA来实现事务功能。

如果要在Hibernate中使用事务,可以通过在核心配置文件hibernate.cfg.xml中配置使用JDBC Transaction还是使用JTA Transaction;若没有配置,默认使用JDBC Transaction

在默认的JDBC Transaction事务管理模式中,每一个SQL命令就是处于一个独立的事务中,当一条SQL命令执行完成以后,事务都会以“提交/回滚的方式”结束;若还有新的SQL命令要执行,将会开启另一个新的事务。

Hibernate框架中,通过Session对象的beginTransaction()方法开启一个新的事务时,底层就会自动调用JDBCsetAutoCommit(false)方法设置事务提交模式为“手动事务模式”,于是,通过Session对象完成了数据库CRUD操作以后,必须通过Transaction对象的commit()rollback()方法手动结束事务。

 

5、事务工厂(Transaction Factory)是生成Transaction对象实例的工厂,该对象无需应用程序直接访问。

 

6、连接提供者(Connection Provider)是生成JDBC连接的工厂,具有数据库连接池的作用,对底层DataSourceDriverManager的功能进行了封装,该对象无需应用程序直接访问。