enterprise javabean (ejb) 是一些应用程序组件,它们实现了 ejb 体系结构规范,并且是 java 2 enterprise edition (j2ee) 平台的一部分。ejb 是开发和部署分布式的、可伸缩的、事务型的、安全的、可移植的、基于组件的商业应用的理想选择。
enterprise javabean (ejb)是一些应用程序组件,它们实现了ejb体系结构规范,并且是java 2 enterprise edition (j2ee) 平台的一部分。ejb是开发和部署分布式的、可伸缩的、事务型的、安全的、可移植的、基于组件的商业应用的理想选择。
基于ejb的商业应用需要一个ejb容器,用于运行时的执行。所有遵从j2ee规范的应用服务器,包括weblogic 8.1在内,都提供了ejb容器。
ejb体系结构背后的主要动机是关系的分离:它将与应用程序基础设施相关的部分(例如事务处理和安全性)与核心应用程序部分(例如业务逻辑)分离开来。简言之,ejb体系结构通过指定ejb容器与ejb开发者之间职责的区别,从而达到这种关系上的分离。例如,透明地实现事务处理是ejb容器的职责,而实现业务逻辑则应由ejb开发者负责。虽然ejb容器执行任务时可能需要某些线索(hint),但是,比起实际地实现这些与基础设施相关的活动来,提供这类线索(通过基于xml的部署描述符)的代价是非常少的。总之,这种关系分离的策略使得商业应用的开发比其他方式要高效得多。
ejb体系结构规范有4种版本:1.0、1.1、2.0和2.1。事实上,ejb version 1.0已经过时了,而最新版本,即2.1,由于刚刚才出现,所以还没有广泛提供。bea weblogic server 8.1同时支持1.1和2.0这两种版本。我们强烈建议在weblogic server 8.1中进行开发时使用ejb version 2.0。
实体bean是一种ejb。除了ejb背后的一般动机外,使用实体bean的特定动机是为持久存储中的业务域(business-domain)实体提供一种驻留在内存中的、可共享的、面向对象的视图。通常,业务域对象就是关系数据库中一个表里面的一行。在本文中,我们讨论了关于在weblogic server 8.1环境下entity ejb的设计、开发和部署的特定问题。至于关于ejb技术的综合教程,我们推荐http://java.sun.com/j2ee上的j2ee教程。
概述
实体bean是设计用来管理关系数据库中的数据的。在bea weblogic server 8.1环境下,entity ejb的开发包括ejb的设计、生成、打包和部署。
从设计的角度来看,实体bean可以由两条正交轴线来分类:持久性和访问。顺着持久性这条轴线,有两种类型的实体bean:bean管理的持久性(bean-managed persistence,bmp)和容器管理的持久性(container-managed persistence,cmp)。如果是cmp,则ejb容器将管理实体bean的持久性。而对于bmp,则由实体bean的开发者通过指定的java代码来管理实体bean的持久性。cmp和bmp之间的选择是互斥的。顺着访问这条轴线,又有两种类型的bean:远程的和本地的。远程实体bean提供了定位的透明性,并且可以从不同的java虚拟机上访问。相反,本地实体bean只能在同一应用服务器内访问。本地和远程之间的选择不是互斥的,因此可以设计具有双重接口的bean。
在ejb体系结构规范中,每个实体ejb组件都是由一组指定的java类和一组指定的xml部署描述符组成。ejb的打包过程包括将所有指定的ejb java类文件和xml部署描述符文件打包到一个java archive (jar)文件中。如果实体ejb还要依赖于一些java助手类文件,那么也可以将这样的类文件包括到ejb jar文件中,或者将它们单独打包到一个不同的jar文件中。
ejb的部署可分为两种方式,要么是在bea weblogic server 8.1内直接部署ejb jar文件以及所依赖的任何jar文件,要么是首先将ejb jar文件和所有依赖的jar文件打包到一个企业应用归档(enterprise application archive,ear)文件内,然后再在weblogic server 8.1内部署这个ear文件。
设计ejb
在设计一个实体时,需要考虑的几个重要选择是:
是设计一个cmp实体bean还是一个bmp实体bean。
是设计一个本地实体bean,还是设计一个远程实体bean,抑或是设计一个双重接口的实体bean。
是设计一个粗粒度(coarse-grained)的实体bean,还是一个细粒度(fine-grained)的实体bean。
是使用数据传输对象,还是使用get和set方法来访问实体ejb中的数据。
下面将讨论在开发实体ejb时要面临的这些设计选择。
cmp与bmp
记住,虽然可能存在一些很合理的例外,但是一般情况下我们强烈推荐使用cmp这种设计。至于为什么要选择cmp,而不是bmp,这里有三大主要原因。
与bmp相比,cmp提供了跨多种不同数据库的可移植性,因为cmp实体bean不包含任何特定于数据库的持久性代码。cmp易于设计、实现和维护。
通常,cmp拥有好于bmp的性能,因为ejb容器将自动生成特定于数据库的代码,并且这些代码将为目标数据库而优化。
cmp通过使用本地接口,使得在相关ejb的网络中程序性地(programmatically)进行导航变得非常容易。
本地接口、远程接口和双重接口
因为cmp通过本地接口管理着实体ejb之间的关系,所以我们强烈建议总是提供一个本地接口。我们认为远程接口需要的时候很少,但是如果仔细评估一下就会证明远程接口也是需要的。所以,我们还是设计一个双重接口吧。
本地接口通过本地客户机提供了对ejb的优化的访问;远程方法调用(remote method invocation,rmi)的语义不要求通过本地客户机、使用本地接口来访问ejb。
远程客户机与ejb容器位于不同的虚拟机上,它需要rmi和远程接口来访问ejb。从理论上讲,单单设计一个本地实体存在着一个明显的缺点,那就是只有在相同应用服务器内的客户机才能访问该实体bean。然而,这只是一个理论上的缺点,因为实际上很少需要从应用服务器之外访问实体ejb。
粗粒度与细粒度
这是一个非常有争议的专题,所以还应根据您个人的经验小心地评价关于此专题的一些不同观点。我们的选择是,实体ejb最常用于表示应用程序业务域中各个实体,所以应该让实体ejb尽量地细粒度,不过也应将设计限定为仅提供一个本地接口。关于这个问题的争论始于ejb体系结构规范1.x版本,当时只能通过一个远程接口来访问实体ejb。建立在ejb 1.x版本基础上的任何反对使用细粒度实体ejb的观点,虽然当时也有合理之处,但是在ejb体系结构规范2.0 中却已不合时宜了,并且最终遭到反对。请谨记:有些专家可能不同意我们的观点,所以我们鼓励您通过实验进行考证,并在此专题上形成自己的观点。
数据传输对象与get和set方法
这又是一个有争议的专题。我们的观点如下所述:
在实体ejb的本地接口中暴露cmp持久字段的所有get访问器(accessor)方法。
为不属于实体ejb主键的一部分的每个cmp持久字段创建包装器(wrapper)set方法,并且在实体ejb的本地接口中暴露这些包装器方法。使用这些包装器方法背后的动机是,cmp要求所有持久字段都具有抽象方法setxxx,如果需要在这些setxxx方法内进行任何验证,那么就可以先在包装器方法内完成验证,然后再调用相应的setxxx方法。如果不需要这样的验证,那么省掉包装器方法而直接包括setxxx方法也无不可。
在某些少见的环境下,可能要求实体ejb有一个远程接口,这时可以为每个实体ejb定义一个数据传输对象,将该数据传输对象作为实体ejb的远程接口中的一个参数,暴露其get和set方法。
生成和打包ejb
在ejb体系结构规范中,每个实体ejb组件都由一组指定的java类和一组指定的xml部署描述符组成:
一个必需的实现实体bean核心功能的bean类。
一个远程接口、本地接口或双重接口,该接口为实体bean提供了适当的客户机视图。
一个远程主接口(home interface)、本地主接口或者双重主接口,该接口为实体bean的生命周期管理提供了适当的接口。
如果是具有组合主键的实体bean,那么还有一个必需的主键类。
一个ejb-jar xml部署描述符文件,ejb体系结构规范version 2.0对此作了规定。
一个特定于供应商的 weblogic-ejb-jar xml部署描述符文件,bea weblogic server 8.1 对此有规定。
如果是cmp实体bean,那么还应有一个特定于供应商的weblogic-cmp-rdbms-jar xml 部署描述符文件,bea weblogic server 8.1对此有规定。
这里使用的例子实体ejb是一个cmp实体ejb,它有一个远程接口,它的名称是accountejb。在随weblogic server 8.1一起安装的示例文件中,即 /weblogic81/samples/server/examples/src/examples/ejb20/basic/containermanaged目录下,可以找到这个实体ejb。
实体bean ejb类和接口可以用ejbgen工具来生成。
ejbgen
ejbgen是一种ejb 2.0代码生成器,它能够从一个ejb bean类生成本地接口/远程接口、本地主接口/远程主接口、主键类和部署描述符。在ejb bean类中使用ejbgen标记来指定不同的ejb设计配置(例如,本地/远程和cmp/bmp)。在weblogic server 8.1 sp01 中,ejbgen 类被包括在/weblogic81/server/lib/weblogic.jar中。在weblogic server 8.1 sp02 & sp03中,ejbgen类被包括在/weblogic81/server/lib/ejbgen.jar文件中。将ejbgen.jar添加到classpath中,以便使用ejbgen工具。
ejbgen通过以下命令来调用:
javadoc -docletpath ejbgen.jar -doclet weblogic.tools.ejbgen.ejbgen
<ejbbeanclass>.java
该命令有一些选项:
-d [directory]: 创建ejb类/接口和部署描述符时所在的目录。
-descriptordir [directory]: 创建部署描述符时所在的目录。
闽公网安备 35060202000074号