2.1. 概况(Overview)
下面的图表提供了 Hibernate 体系结构的高层视图:

提供 Hibernate 所有运行时体系结构的更多细节不是本文档的范畴。由于 Hibernate 非常灵活,且支持多种应用方案, 所以我们这只描述一下两种极端的情况:“最小”和“全面解决”的体系结构方案。
下图演示了 Hibernate 如何使用数据库和配置信息来为应用程序提供持久化服务(以及持久的对象)。
“最小”的体系结构方案,要求应用程序提供自己的 JDBC 连接并管理自己的事务。这种方案使用了Hibernate API 的最小子集:

“全面解决”的体系结构方案,将应用层从底层的 JDBC/JTA API 中抽象出来,而让 Hibernate 来处理这些细节。

图中各个对象的定义如下:
- SessionFactory (
org.hibernate.SessionFactory
) 针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 作为
Session
的工厂和ConnectionProvider
的客户。SessionFactory
可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。- 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
对象实例的工厂。仅供开发者扩展/实现用,并不开发能够给应用程序使用。- Extension Interfaces
Hibernate 提供了很多可选的扩展接口,你可以通过实现它们来定制你的持久层的行为。具体请参考 API 文档。
在特定“最小”的体系结构中,应用程序可能绕过 Transaction
/TransactionFactory
以及 ConnectionProvider
等 API 直接跟 JTA 或 JDBC 打交道。