企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 2.1\. 概况(Overview) 一个非常简要的Hibernate体系结构的概要图: ![](https://box.kancloud.cn/2016-01-06_568cdb4ea08e6.gif) 从这个图可以看出,Hibernate使用数据库和配置信息来为应用程序提供持久化服务(以及持久的对象)。 我们来更详细地看一下Hibernate运行时体系结构。由于Hibernate非常灵活,且支持多种应用方案, 所以我们这只描述一下两种极端的情况。“轻型”的体系结构方案,要求应用程序提供自己的JDBC 连接并管理自己的事务。这种方案使用了Hibernate API的最小子集: ![](https://box.kancloud.cn/2016-01-06_568cdb4eae88f.gif) “全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来,而让Hibernate来处理这些细节。 ![](https://box.kancloud.cn/2016-01-06_568cdb4ec40c2.gif) 图中各个对象的定义如下: 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提供了很多可选的扩展接口,你可以通过实现它们来定制你的持久层的行为。 具体请参考API文档。 在特定“轻型”的体系结构中,应用程序可能绕过 `Transaction`/`TransactionFactory` 以及 `ConnectionProvider` 等API直接跟JTA或JDBC打交道。