概说Entity JavaBeans

ZDNet软件频道 时间:2002-08-02 作者:BUILDER.COM |  我要评论()
本文关键词:
Entity Beans就如同建设J2EE程序大厦的砖块。它是对自治持久对象的逻辑抽象。了解持久存储、辅助类和Entity Beans之间的关系有助于开发人员在可用的应用程序基础之中融入抽象的业务思想。
为了充分利用J2EE的Enterprise JavaBeans(EJB)架构,应用程序就不应当独独依赖于Session Beans(也就是活动、任务或者实施处理的抽象逻辑)。效率高的应用程序还会把暂时性的功能和持久性的对象结合起来。比方说,改变用户口令的方法就是把暂时操作(改变口令)应用于持久对象(用户)。为了在开发工作中改进EJB的功能,同时那些持续时间超过会话时间长度的对象也需要继续存在下去,所以Entity Beans就来派用场了。

实体封装

Entity JavaBeans封装了业务对象的属性和方法,乍看起来同其他面向对象设计别无二至。而主要的区别是Entity Beans具有自身固有的持久性。因为Entity Beans通过存储设备保证持久性,所以他们的值来源于对象生存期的延长。一旦创建和保存了Entity Bean,Entity Bean的生存期甚至可能会超出其驻留的EJB容器的生存期。这就是说,哪怕EJB容器或者运行容器的服务器崩溃了,对象最新版本的记录也会继续存在!

以下是一条一般意义的设计原则:假如J2EE应用程序中的某个对象需要保存其数据和对象修改这些数据的方法,那么请使用Entity Bean。

Entity Beans最适合表示那些可能承受改变的业务对象只不过修改的频率并不很高。比如说,电子商务系统中的“用户”对象就非常适合采用Entity Bean来表示。诸如用户名、地址和其他信息等都需要保持静态。当某位用户修改他或者她的地址时,Entity Bean反映修改操作,并保存起来供今后引用。这样,下一次用户登录时就会出现新的地址了。对象的持久性可以让用户同应用程序交互而无须多次重复输入信息;持久性还可以让开发人员专心关注组件之间的交互而不用关心组件本身的细节。

存储

虽然Entity Bean的存储方式通常采取数据库记录的形式,但是,其他形式的持久存储措施也是同样可行的,比如文件系统中的文件就是这样。就本文而言,我们假设的存储方式是数据库存储。对Entity Bean的保存来说,唯一必要的就是确定唯一标识的能力。再重造对象的时候,bean应该同以前没什么差别。采用主键这个概念显然是那些开发数据库应用程序的人所特别熟悉的了。

为了让主键机制能够正常运行,EJB容器就必须找到bean的特定实例。findByPrimaryKey()方法用一个代表bean主键的对象作为参数,返回该bean的远程接口。主键类通常只起到其他类的封装作用,如程序清单 A所示。除了这一Entity Bean需要之外,开发人员还可以实现其他的实例发现方法。定位bean的特定实例的任何方式都能起作用的,比如用户名、邮政编码或者产品标记等等。Finder方法还可能返回符合检索条件的Entity Beans的java.util.Enumerationjava.util.Collection

持久性

在构造Entity Beans的时候,开发人员可以控制持久性。Beans可以采用bean管理的持久性(BMP)或者容器管理的持久性(CMP)。两者之间的差别显而易见。要不是bean要不就是EJB容器负责维护持久性,获取bean并提交存储。开发人员在部署描述符ejb-jar.xml作出以上的控制选择。程序清单 B所示就是采用BMP的部署描述符。

开发人员还应该尽力保证对象对数据的“纯粹”封装。优秀的Entity Bean设计会结合辅助的类为bean提供强大的功能,采用分离的数据访问对象提供数据库和bean之间的通讯就是这样的示例。采用这种方式设计beans会在创建或者获取beans的场合降低负载。因为辅助类并不需要持久性从而避免了相应的负载。

BMP
对BMP而言,开发人员必须自己编写数据库事务的所有代码。其中包括管理数据库连接、确定选择逻辑和选择需要保存的数据成员等。程序清单 C就是一个BMP EJB的示例。虽然拥有强大的程序控制力度往往会很对开发人员的胃口,不过,这种做法往往也会伴随着可能的问题。同数据库通讯的性能问题、JDBC逻辑的更多编码工作以及对某些数据库的过分依赖等等,这些问题都是你必须考虑的。

CMP
CMP Entity Beans避开了需要EJB容器处理持久性所带来的复杂性。此外,具体的CMP选择也是在部署描述符中操作的,代码行如下所示:
<persistence-type>Container</persistence-type>

在部署CMP bean的时候,容器必须知道哪些数据成员才需要保存。实际上,并不是Entity Bean的所有数据成员都需要保存的。只有那些组成复杂对象的数据才需要保存。此类信息可以参看程序清单 D中的ejb-jar.xml

CMP的采用大大简化了Entity Beans的开发工作、消除了数据库事务编码的复杂性。CMP还增加了Entity Beans的可移植性,促使它们免于特定数据库结构的约束。在部署CMP bean的时候,容易采用了映射工具令对象数据成员匹配其对应的数据库列,有时甚至可以立即创建数据表。这样做就便利了应用程序开发的数据库设计阶段的工作。可是,让容器管理持久性却会造成性能的降低。还有,某些容器,比如跨多个数据表表示多个数据成员的容器不可能处理复杂的对象。


获得代码
本文中的示例代码可以从这里下载。


小结

Entity Beans就如同建设J2EE程序大厦的砖块。它是对自治持久对象的逻辑抽象。了解持久存储、辅助类和Entity Beans之间的关系有助于开发人员在可用的应用程序基础之中融入抽象的业务思想。


责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134