| 风信Java论坛 ›› Hibernate 讨论专区 ›› Hibernate 体系结构(Architecture) | 登录 -> 注册 |
|
1F Hibernate 体系结构(Architecture) 唧唧 Post by : 2008-07-07 17:08:08.0
第 2 章 体系结构(Architecture) 2.1. 概况(Overview) 一个非常简要的Hibernate体系结构的概要图: ![]() 从这个图可以看出,Hibernate使用数据库和配置信息来为应用程序提供持久化服务(以及持久的对象)。 我们来更详细地看一下Hibernate运行时体系结构。由于Hibernate非常灵活,且支持多种应用方案, 所以我们这只描述一下两种极端的情况。“轻型”的体系结构方案,要求应用程序提供自己的JDBC 连接并管理自己的事务。这种方案使用了Hibernate API的最小子集: ![]() “全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来,而让Hibernate来处理这些细节。 ![]() 图中各个对象的定义如下:
在特定“轻型”的体系结构中,应用程序可能绕过 Transaction/TransactionFactory 以及 ConnectionProvider 等API直接跟JTA或JDBC打交道。 2.2. 实例状态 一个持久化类的实例可能处于三种不同状态中的某一种。 这三种状态的定义则与所谓的持久化上下文(persistence context)有关。 Hibernate的Session对象就是这个所谓的持久化上下文:
2.3. JMX整合 JMX是管理Java组件(Java components)的J2EE标准。 Hibernate 可以通过一个JMX标准服务来管理。 在这个发行版本中,我们提供了一个MBean接口的实现,即 org.hibernate.jmx.HibernateService。
想要看如何在JBoss应用服务器上将Hibernate部署为一个JMX服务的例子,您可以参考JBoss用户指南。 我们现在说一下在Jboss应用服务器上,使用JMX来部署Hibernate的好处:
这些选项更多的描述,请参考JBoss 应用程序用户指南。 将Hibernate以部署为JMX服务的另一个好处,是可以查看Hibernate的运行时统计信息。参看 第 3.4.6 节 “ Hibernate的统计(statistics)机制 ”. 2.4. 对JCA的支持 Hibernate也可以被配置为一个JCA连接器(JCA connector)。更多信息请参看网站。 请注意,Hibernate对JCA的支持,仍处于实验性阶段。
2.5. 上下文相关的(Contextual)Session 使用Hibernate的大多数应用程序需要某种形式的“上下文相关的” session,特定的session在整个特定的上下文范围内始终有效。然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常是困难的;不同的上下文对“当前”这个概念定义了不同的范围。在3.0版本之前,使用Hibernate的程序要么采用自行编写的基于ThreadLocal的上下文session,要么采用HibernateUtil这样的辅助类,要么采用第三方框架(比如Spring或Pico),它们提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关session。
从3.0.1版本开始,Hibernate增加了SessionFactory.getCurrentSession()方法。一开始,它假定了采用JTA事务,JTA事务定义了当前session的范围和上下文(scope and context)。Hibernate开发团队坚信,因为有好几个独立的JTA TransactionManager实现稳定可用,不论是否被部署到一个J2EE容器中,大多数(假若不是所有的)应用程序都应该采用JTA事务管理。基于这一点,采用JTA的上下文相关session可以满足你一切需要。 更好的是,从3.1开始,SessionFactory.getCurrentSession()的后台实现是可拔插的。因此,我们引入了新的扩展接口(org.hibernate.context.CurrentSessionContext)和新的配置参数(hibernate.current_session_context_class),以便对什么是“当前session”的范围和上下文(scope and context)的定义进行拔插。 请参阅org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有关于它的契约的详细讨论。它定义了单一的方法,currentSession(),特定的实现用它来负责跟踪当前的上下文session。Hibernate内置了此接口的三种实现。
前两种实现都提供了“每数据库事务对应一个session”的编程模型,也称作每次请求一个session。Hibernate session的起始和终结由数据库事务的生存来控制。假若你在纯粹的 Java SE之上采用自行编写代码来管理事务,而不使用JTA,建议你使用Hibernate Transaction API来把底层事务实现从你的代码中隐藏掉。如果你使用JTA,请使用JTA借口来管理Transaction。如果你在支持CMT的EJB容器中执行代码,事务边界是声明式定义的,你不需要在代码中进行任何事务或session管理操作。请参阅第 11 章 事务和并发一节来阅读更多的内容和示例代码。 hibernate.current_session_context_class配置参数定义了应该采用哪个org.hibernate.context.CurrentSessionContext实现。注意,为了向下兼容,如果未配置此参数,但是存在org.hibernate.transaction.TransactionManagerLookup的配置,Hibernate会采用org.hibernate.context.JTASessionContext。一般而言,此参数的值指明了要使用的实现类的全名,但那三种内置的实现可以使用简写,即"jta"、"thread"和"managed"。 |
|
2F 千山暮雪 Post by : 2008-08-23 16:31:55.0
迫切的希望知道楼主的身份!
作培训的还是? |
|
3F 唧唧 Post by : 2008-08-23 17:35:09.0
呵呵,我也只是一个爱好者,这个论坛是我自己做的
/5b016f381a8d1ec5011a8f171f100002.jhtml 本论坛是采用Struts + Hibernate 开发的Java BBS系统,数据库采用MySQL 很遗憾,目前为止,我还不会Spring框架,否则就有可能做成标准的SSH系统了~ 开发环境:Eclipse 3.3 + Tomcat 6 运行环境:Windows 2003 Resin 3.1.6 + MySQL 5.1.24 |
| 风信Java论坛 ›› Hibernate 讨论专区 ›› Hibernate 体系结构(Architecture) | 登录 -> 注册 |