摘要 Sun的EJB 3.0规范正处于其最后的"冲刺"阶段,许多公司都在为遵循这一规范而忙碌着。这个EJB规范最新版本所提供的众多优点中比较突出的当属其数据库功能,但是一些开发人员感到,这个规范仅仅是Hibernate持久性存储引擎的一个"克隆"版。真的吗?本文正是想讨论这一问题。
实践证明,Hibernate是针对于Java语言所创建的最优秀的持久化存储引擎之一。至今,我还清晰地记得第一次使用Hibernate工作的情景。当时,我们已经有了一种现成的持久化存储引擎,但是这个引擎将消耗大量的系统资源并且从未真正正确工作过。令人惊奇的是,Hibernate"瞬间"解决了我们的持久化存储问题!这真是一个"天赐之物"。不觉间,时间快速推进到今天。EJB 3.0又浮出水面,并且不久我们就要计划把我们当前的EJB 2.x服务器向这个更高版本升级了。然而,仔细地分析一下EJB 3.0中所作的持久性存储变化,有人可能会感到惊讶-这不是来自于Hibernate的一个"克隆"品吗?难道Sun当真"偷窃"了来自于Hibernate的设计吗?我的回答是,情况要比这些复杂得多。
一、 EJB 3.0
EJB 3.0必须实现的重要目标之一是,要使之成为更为有用和更易于使用的开发工具。Sun公司的Linda DeMichiel认识到,为了成功实现这一目标,EJB 3.0必须要基于开发人员今天正在使用的现有库;否则,它将会导致一种困难的升级操作并且可能会引不起足够的重视。因此,来自于Oracle,JBoss,Apache,BEA,Novell,Google的成员和其它方面的专家都被邀请参与制订这一规范。这个小组的目标是,生产一种规范-能够使得EJB更易于开发并且还要创建一种便于开发人员能够容易地实现升级的持久性存储标准。
当这个小组开始开发EJB 3.0规范时,他们很快认识到,其中很多特征应该在功能上与所有的主要的供应商和库保持一致。我们将在下面的几节中讨论这些特征。
(一) EntityManager
这个EntityManager负责处理一个事务。在JDO中,它被称作持久性存储管理器,而在Hibernate中称它为一个会话。在GlassFish工程中,EntityManager被作如下描述:
其实,一个EntityManager实例与一个持久性存储上下文相关联。一个持久性存储上下文是一组实体实例,其中的任何一个持久性实体都是唯一的一个实体实例。在该持久性存储上下文中,实体实例及其生命周期都是可被管理的。这个接口定义了用于与持久性存储上下文进行交互的方法。EntityManager API用于创建和删除持久性实体实例-通过其主键查找实体和查询实体。
这个可由一个给定的EntityManager实例管理的实体集合是通过一个持久性存储单元进行定义的。一个持久性存储单元定义了所有类的集合,这些类是相联系的或由应用程序加以分组,并且它们必须共存于它们到单个数据库的映射中。
(二) 命名查询
一个命名查询是一个预定义的查询,它被赋予一个名字,这样它可以在以后通过该名字加以存取。用数据库术语来说,命名查询被称作存储过程。当结合本机查询时(见下一节),数据库查询应该是非常轻松的。
(三) 本机查询
不是使用具有很多限制性的实体查询语言,本机查询允许直接从EJB中全面地使用SQL语言。现在,我们有可能直接在数据库上调用count(),max()和其它功能而不必付出其它周折。
(四) 回调监听器
回调监听器,是一种事件监听器,或用数据库术语来说是,是一种触发器。它们支持当一个事件发生时进行代码调用。
(五) 脱离/重新依附对象
能够脱离开一个EntityManager的控制范围而又能够重新返回而被持续化存储,这在EJB 3.0版本之前是无法实现的。在以前,为了实现这一目的,必须把来自于一个对象的值必须被复制到一个POJO(普通Java对象)中,然后被再往回复制。
在EJB 3.0之前,我总是使用值-对象并且把来自于EJB的值复制到一个POJO中;然后,使用在前端使用该对象。如果该POJO中的一个值被改变,它将不得不被"推回"到该EJB;然后,该值被复制回来。这种"混乱"状态现在已经不复存在了。一个对象甚至能够完全离开JVM并且在以后某个时期返回回来并且被重新依附。这种改变所带来的效率是不能被低估的。
(六) O/R映射类型
能够把一个EJB中的字段直接映射到一个数据库中的列上是EJB 3.0以前也是很难实现的。这一功能实现一直不那么令人满意,并且很多第三方开发工具都一再推迟对这种功能的支持。我最喜欢的xDoclet的一个特征是,它能够定义在我的EJB中每一个持久性字段对应哪种SQL类型。借助于EJB 3.0和注解技术,我们不再需要使用一种第三方工具。
二、 EJB 3.0对象
值得注意的是,企业Java Bean现在被称为POJO。随着注解技术的出现,java bean不再需要接口、home和描述符支持文件。仅仅这个特征就为EJB 3.0赢得了大批开发团队的青睐。
现在,既然企业对象不再被锁定到应用程序服务器内,那么我们不再需要把它们复制进和复制出POJO,这样就允许不必把应用程序服务器后端和前端区别得那么严格,从而使开发人员能够更容易地显示和编辑存储于EJB中的数据。我们很快就会看到这些变化对xDoclet所产生的有趣影响。
三、 结论
尽管毫无疑问,EJB 3.0基于Hibernate,但是,事实上它是基于所有的顶级的对象/关系映射工具。看来,这个工具并非这些工具简单"修改"版,而事实上是由Sun创造的又一部杰出的"电影"。不必让开发人员学习一种"全新的但还是功能相同的工具",开发人员只需要轻松地花一些时间就可以升级到新版的EJB 3.0中,因为EJB 3.0正是基于他们已经了解和喜欢的工具创建的。