详述Hibernate架构(Architecture)

开发 后端
运行时Hibernate架构,由于Hibernate非常灵活,且支持数种应用方案,所以我们这只描述一下两种极端的情况。“轻型”的架构方案,要求应用程序提供自己的JDBC 连接并管理自己的事务

要学好Hibernate,首先要了解Hibernate架构,可能大家对Hibernate架构还不太明白,没有关系,看完本文你肯定有不少收获,希望本文能教会你。

1. 架构概况(Overview)

一个非常简要的Hibernate架构的概要图:

预览图片

从这个图可以看出,Hibernater使用数据库和配置信息来为应用程序提供持久化服务(以及持久的对象)。

我们来更详细地看一下运行时Hibernate架构。由于Hibernate非常灵活,且支持数种应用方案,所以我们这只描述一下两种极端的情况。“轻型”的架构方案,要求应用程序提供自己的JDBC 连接并管理自己的事务。这种方案使用了Hibernate API的最小子集:

预览图片

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

预览图片

Heres some definitions of the objects in the diagrams: 图中各个对象的定义如下:

SessionFactory (org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,它也是线程安全的(不可变)。 它是生成Session的工厂,本身要用到ConnectionProvider。 该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。

Session (org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。 其隐藏了JDBC连接,也是Transaction的工厂。 其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。

持久的对象及其集合
带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。 这些对象可以是普通的JavaBeans/POJO,唯一特殊的是他们正与(仅仅一个)Session相关联。 这个Session被关闭的同时,这些对象也会脱离持久化状态,可以被应用程序的任何层自由使用。 (例如,用作跟表示层打交道的数据传输对象data transfer object。)

瞬态(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打交道。

2. 实例状态

一个持久化类的实例可能处于三种不同状态中的某一种。 这三种状态的定义则与所谓的持久化上下文(persistence context)有关。Hibernate的Session对象就是这个所谓的持久化上下文:

◆瞬态(transient)该实例从未与任何持久化上下文关联过。它没有持久化标识(相当于主键)。

◆持久(persistent) 实例目前与某个持久化上下文有关联。 它拥有持久化标识(相当于主键),并且可能在数据库中有一个对应的行。 对于某一个特定的持久化上下文,Hibernate保证持久化标识与Java标识(其值代表对象在内存中的位置)等价。

◆脱管(detached) 实例曾经与某个持久化上下文发生过关联,不过那个上下文被关闭了, 或者这个实例是被序列化(serialize)到这个进程来的。 它拥有持久化标识,并且在数据库中可能存在一个对应的行。 对于脱管状态的实例,Hibernate不保证任何持久化标识和Java标识的关系。

3. JMX整合

JMX是管理Java组件(Java components)的J2EE规范。 Hibernate 可以通过一个JMX标准服务来管理。 在这个发行版本中,我们提供了一个MBean接口的实现,即 org.hibernate.jmx.HibernateService。

想要看如何在JBoss应用服务器上将Hibernate部署为一个JMX服务的例子,您可以参考JBoss用户指南。 我们现在说一下在Jboss应用服务器上,使用JMX来部署Hibernate的好处:

Session管理: Hibernate的Session对象的生命周期可以 自动跟一个JTA事务边界绑定。这意味着你无需手工开关Session了, 这项 工作会由JBoss EJB 拦截器来完成。你再也不用担心你的代码中的事务边界了(除非你想利用Hibernate提供 的Transaction API来自己写一个便于移植的的持久层)。 你现在要通过 HibernateContext来操作Session了。

HAR 部署: 通常情况下,你会使用JBoss的服务部署描述符(在EAR或/和SAR文件中)来部署Hibernate JMX服务。 这种部署方式支持所有常见的Hibernate SessionFactory的配置选项。 不过,你需在部署描述符中,列出你所有的映射文件的名字。如果你使用HAR部署方式, JBoss 会自动探测出你的HAR文件中所有的映射文件。

这些选项更多的描述,请参考JBoss 应用程序用户指南。

将Hibernate以部署为JMX服务的另一个好处,是可以查看Hibernate的运行时统计信息。“ Hibernate的统计(statistics)机制 ”.

4. 对JCA的支持

Hibernate也可以被配置为一个JCA连接器(JCA connector)。更多信息请参看网站。请注意,Hibernate对JCA的支持,仍处于实验性质。

【编辑推荐】

  1. 简述Hibernate中加载并存储对象
  2. Hibernate传播性持久化攻略
  3. 深入了解Hibernate自动状态检测
  4. 教你如何在Hibernate中实例化集合和代理
  5. Hinerbate单端关联代理颇析
责任编辑:仲衡 来源: redsaga
相关推荐

2009-06-02 14:24:32

Hibernate单元测试HSQLDB

2009-09-21 12:50:34

Hibernate架构

2015-05-25 13:44:42

微服务微服务架构Docker

2023-07-19 10:09:18

架构仓库SSD

2022-11-29 20:32:07

2010-05-07 14:27:16

IPVS负载均衡

2010-07-12 14:41:35

UDP协议

2010-05-06 15:00:58

集群负载均衡

2010-09-26 14:16:26

DHCP协议应用

2010-09-01 17:11:01

DHCP中继代理

2023-10-09 08:20:12

整洁架构软件设计原则

2015-07-08 14:18:44

可扩展架构设计云计算

2011-08-22 15:03:17

nagios

2010-02-07 09:52:22

Android 插件

2011-08-25 15:40:52

MPLS LDP协议LSRLDP

2011-08-25 11:52:35

2013-05-28 11:04:42

Android开发Android编译源码编译

2009-06-10 15:00:58

Hibernate二级配置

2016-07-01 16:13:13

AWSLambda

2010-03-05 10:57:48

Android系统
点赞
收藏

51CTO技术栈公众号