容器管理持续化示例原著:Dale Green 译者前言 有关本章中相应源代码的下载,请参看一个Session Bean的示例。 正文 使用一个容器管理持续化的entity bean可以为开发者提供很多方便。首先,EJB容器会处理所有的数据库的存储和检索。其次,容器会管理entity bean之间的关联关系。因为这些优势的存在,你不需要在entity bean中编写数据库访问调用。你只需要在bean的部署描述中进行设置。这样做的目的不仅仅是节约你的时间,它也使得bean可以很方便地适用于不同的数据库服务。 在这一章,我们主要讨论一个名为RosterApp的示例的源代码和部署设置,这个示例具有容器管理持续化的entity bean的基本特征。如果你对这一章的术语和概念还不熟悉,请参考容器管理持续化。 RosterApp应用程序概述 RosterApp应用程序维护了体育联盟中各运动队的队员花名册。这个应用程序有五个组件。RosterAppClient组件是一个J2EE应用程序客户端,它通过RosterEJB这个session bean的remote接口对其进行访问。RosterEJB访问三个entity bean--PlayerEJB、TeamEJB和LeagueEJB--这个访问是通过三个entity bean的local接口实行的。 entity bean使用容器管理持续化和关联关系。在TeamEJB和PlayerEJB这两个entity bean之间存在一个双向的,多对多的关系。在一个双向的关系中,每个bean都有一个值为它所关联的bean的实例的序别号的关联字段。TeamEJB-PlayerEJB关系是一个多对多的关系:队员可以参与多个属于不同队伍的运动队,而每个运动队都有多名队员。LeagueEJB与TeamEJB这两个entity bean之间也存在一个相向的关系,但是这是一个一对多的关系:一个联盟有很多运动队,但是一个运动队只能属于一个联盟。 图6-1说明了RosterApp应用程序中的组件及其关联关系。虚线表示通过调用JNDI lookup方法获得的访问。实线表示容器管理的关联关系。 图6-1 RosterApp J2EE应用程序 PlayerEJB代码 PlayerEJB这个entity bean描述了体育联盟中的一个队中的一个队员。和其它使用容器管理持续化的entity bean一样,PlayerEJB需要以下代码: 1、Entity bean类(PlayerBean) 2、Local home接口(LocalPlayerHome) 3、Local接口(LocalPlayer) 在j2eetutorial/examples/src/ejb/cmproster目录下有这个示例的源代码。要编译这个代码,到j2eetutorial/examples目录下,输ant cmproster。在j2eetutorial/examples/ears下有RosterApp.ear文件的示例。 Entity Bean类 在容器管理持续化的情况下,entity bean类的代码必须满足以下条件。首先,类必须定义为public和abstract。此外,这个类还必须实现以下内容: 1、EntityBean接口 2、零个或多个ejbCreate方法及ejbPostCreate方法 3、对应于持续化及关联字段的定义为abstract的get方法及set方法 4、所有的select方法都必须定义为abstract 5、home方法 6、business方法 entity bean类不能实现以下方法: 1、finder方法 2、finalize方法 容器管理持续化代码和Bean管理持续化代码的差别 因为不包含对数据库访问的调用,一个使用容器管理持续化的entity bean的代码要比相同功能的bean管理持续化的短得多。例如,在这一章中讨论的PlayerBean.java的源文件就要比我们在第五章中讨论的SavingsAccountBean.java要短得多。表6-1对这两个类型的entity bean的代码作了比较。 表6-1 两种持续化的代码差异 差异:容器管理:Bean管理 类定义:Abstract:非abstract 数据库访问调用:由工具生成:由开发者编写 持续化状态:由虚拟的持续化字段表现:作为一个实例变量编写 持续化及关联字段的访问方法:需要:不需要 findByPrimaryKey方法:由容器处理:由开发者编写 自定义finder方法:由容器处理,但是开发者必须定义EJB QL查询:由开发者编写 Select方法:由容器处理:没有 ejbCreate的返回值:可以为null:必须是主键 在这两个类型的持续化中,实现商业方法和home方法的规则是一样的。参见第五章中的商业方法和Home方法。 访问方法 一个使用容器管理持续化的entity bean具有持续化字段和关联字段。这些字段是虚拟的,因此你不需要在类中将其作为实例变量编写。你只需要在bean的部署文档中指定它们。要对这些字段进行访问,你需要在entity bean类中定义抽象的get方法和set方法。 持续化字段的访问方法 EJB容器自动执行bean的持续化字段的数据库存储和读取。PlayerEJB的部署描述指定了以下持续化字段: 1、playerId(主键) 2、name 3、position 4、salary PlayerBean类定义了对如下的对持续化字段的访问方法:
一个访问方法的命名以get或set开始,后面是首字母大写的持续化及关联字段。例如,对salary字段的访问方法是getSalary和setSalary。这个命名习惯是和JavaBeans组件类似的。 对关联字段的访问方法 在RosterApp应用程序中,因为一个队员可以属于多个运动队,因此一个PlayerEJB实例可能与多个TeamEJB实例关联。为了指定这个关联关系,PlayerEJB的部署描述定义了一个名为teams的关联字段。在PlayerBean类中,teams关联字段的访问方法如下: 上一篇:在GoF模式以外(1) 下一篇:Bean管理持续化实例 更多相关文章
|
推荐文章
精彩文章
|