就像我们在设计模式4中看到的,EntityBean的实现大小被缩减到在ejbCreate(),getData()
andsetData()方法中的仅仅几行,不管CMP字段的数目.
下一步是建模公司和雇员的EntityBeans,这个有点繁琐而且建议读者先对borland
公司的<EJB程序员指南>的ORMapping和高级CMP有所了解.
对这个关系建模根本不需要对结构的代码变化,然而EntityBeans实现类需要一点点
修改来反映两个实体间的关系,鉴于此DeploymentDescriptor需要有小的修改.
象以前,EntityBean从结构继承,下面是公司EntityBean的代码片段:
publicclassCompanyBeanextendsCompanyStruct
implementsEntityBean{
EntityContextentityContext;
//CMPforallfieldsintheCompanyStruct
publicjava.util.Collectionemployees;//one-to-many
//restofthecodeincludinggetData()andsetData()
publicjava.util.CollectiongetEmployees(){
returnemployees;
}
}
下面是雇员EntityBean的程序片段:
publicclassEmployeeBeanextendsEmployeeStruct
implementsEntityBean{
EntityContextentityContext;
//CMPforallfieldsinEmployeeStructEXCEPT
//thecomId
publicCompanycompany;//remotereferencetocompany
}
在上面的程序片段中,雇员EntityBean从雇员结构继承,雇员结构本身有
一个字段comId表示雇员和公司之间的的外键,在所有的前面的设计模式中,
这个字段是CMP的.而在设计模式5中这个字段用在DeploymentDescriptor中
un-checking的方法从CMP中去掉.而对公司EntityBean的远程引用现在是CMP的.
现在的问题是怎么在getData()和SetData()方法中更新公司EntityBean的引用,
当这些方法只get和setcomId(在设计模式上下文中没有被CMP)的值.
简单的说,过程的结构没有变化并且字段comId(不再CMP)在RPC中被拷贝到
EntityBean和从EntityBean拷贝出来.需要的是对公司EntityBean的远程
引用在必须被写入数据库和从数据库读出时更新.我们需要用ejbLoad()和ejbStore()
方法在EntityBean实现类中为我们完成这项工作.
在雇员EntityBean中的ejbLoad()方法的代码片段如下:
publicvoidejbLoad(){
try{
comId=(company==
null)?null:(Integer)company.getPrimaryKey();
}catch(Exceptione){
//throwsomeruntimeexception(e.g.EJBException)
}
}
以上代码几乎不需要解释.当数据被从数据库中读出(在事务的开始时候),
comId(不是CMP)字段在雇员EntityBean被set.因此当getData()方法被调用时,
返回的结构将包含正确地comId的值.
在雇员EntityBean中的ejbStore()方法如下:
publicvoidejbStore(){
try{
company=(comId==
null)?null:beanGlossary.getCompanyHome().findByPrimary
Key(comId);
}catch(Exceptione){
//throwsomeruntimeexception(e.g.EJBException)
}
}
ejbStore()在事务结束当数据被写入数据库时被调用.在这种情况下,comId的值
被修改(通过调用setData方法),this必须被写到数据库中.在上面方法中的代码
把comId转化成公司的远程引用.(毕竟comId是公司EntityBean的主键).
使用空check的原因是数据库不能存空值(表之间的弱引用),并且这些同样需要建模.
任何情况下,用java对基本类型的封装要比使用基本类型自己好,因为他们能
存空值而且易于转换成其他形式.
上面的BeanGlossary类的代码片断容易引起一些混淆.
这实际上是一个捕获EJB的lookup的utility类(一个无状态sessionbean),
在entitybean和有状态sessionbean的情况下,Home接口的lookup是被缓冲的.
在无状态sessionbean的情况下,Remote接口是被缓冲的(作为ejb规范1.1的一部分,
一个SLSB在Home接口中调用的create()是不被优化的).
通过在上面上下文的缓冲,我们意思是第一个请求是被lookup的.随后的调用是得到
已经在对象引用中初始化的home接口或remote接口.
BeanGlossarySButility类的代码片段如下:
publicclassBeanGlossarySBimplementsSessionBean{
privateContextcontext=null;
publicjavax.naming.ContextgetContext()throws
NamingException{
if(context==null)
context=newjavax.naming.InitialContext();
returncontext;
}
//Company
privateCompanyHomecompanyHome=null;
publicCompanyHomegetCompanyHome()throws
NamingException{
if(companyHome==null)
companyHome=((CompanyHome)
javax.rmi.PortableRemoteObject.narrow(
getContext().lookup("java:comp/env/ejb/Company"),
CompanyHome.class));
returncompanyHome;
}
//restoftheEJBs
}
在设计模式5中,我们没有处理EntityBean的Home接口.
在雇员EntityBean的情况下,会有一个finder元素在
findEmployeesByCompany(CompanypCompany)的几行中,
这将会返回雇员远程引用的集合.在公司EntityBean中的Deployment
Descriptormap了在上面定义的finder元素的雇员集合.
这样,在公司EntityBean中的方法getEmployees()在remote接口中的调用
返回需要的与那家公司相联系的远程引用的雇员的集合.
分享到:
相关推荐
【EJB设计模式概述】 EJB(Enterprise JavaBeans)设计模式是解决在Java EE平台中使用EJB组件遇到的问题和挑战的一种策略。这些模式旨在优化系统性能、可扩展性、可维护性,以及提高组件的重用性。在大型、复杂的...
本书包括了多个高级EJB设计模式,还提供了使用EJB设计模式的策略、J2EE开发的最佳实例,以及非常实用的EJB设计技巧和技术。本书还包括以下内容:架构模式、事务和持久性模式、客户端交互模式、主键一成策略。用Ant...
EJB设计模式是针对EJB规范中可能出现的问题和挑战,经过实践提炼出的最佳实践和解决方案,帮助开发者更好地理解和应用EJB技术。 ### 1. EJB概述 EJB是Java平台上的服务器端组件模型,主要分为三种类型:会话Bean...
本书作者是世界上EJB设计模式领域内的卓越专家,他领导着EJB设计模式项目。本书不仅从理论上对设计模式在EJB上的应用进行了深入的探讨,而且通过实例展示了EJB设计模式的魅力。本书提出的模式都可以应用于实际项目中...
【EJB设计模式详解】 EJB(Enterprise JavaBeans)是一种在Java EE平台上构建企业级应用程序的核心组件。EJB设计模式是软件开发中的重要概念,它借鉴了设计模式的经典理论,目的是提升EJB架构的灵活性、可扩展性、...
**EJB设计模式** Enterprise JavaBeans (EJB) 是Java平台企业版(Java EE)中的核心组件,用于构建可扩展的、分布式的、事务处理的服务器端应用。EJB设计模式是开发人员在实践中总结出的解决特定问题的常用方法,...
EJB设计模式是开发者在实际项目中解决特定问题时,根据EJB规范和最佳实践形成的重复性解决方案。这些模式为复杂的企业级应用开发提供了结构化和可重用的方法。 1. **单例Session Bean** - 在EJB中,单例Session ...
这本书“EJB设计模式 中文版”很可能是为中文读者提供了一个深入理解EJB设计模式的指南。 ### EJB概述 EJB是Java EE(企业版)的一部分,主要处理业务逻辑和数据存储。EJB分为三种主要类型:会话bean(Session ...
EJB设计模式是开发者在处理EJB时遵循的最佳实践,这些模式有助于解决常见的复杂问题,提高代码的可重用性、可维护性和性能。本资料《EJB设计模式》旨在帮助读者深入理解这些模式并将其应用到实际开发中。 1. **单例...
**Java EJB设计模式** Enterprise JavaBeans(EJB)是Java EE平台中用于构建企业级分布式应用程序的核心组件。EJB设计模式是开发人员在解决EJB应用中常见问题时总结出的最佳实践,它们有助于提高代码的可重用性、可...
《EJB设计模式》是该领域的经典著作,它深入探讨了在EJB开发中常用的设计模式,帮助开发者理解和应用这些模式来解决实际问题。 **1. 会话Bean(Session Beans)** 会话Bean是客户端与服务器交互的代理,提供了业务...
设计模式是解决常见问题的模板,可以提高代码的可复用性和可维护性,EJB设计模式的运用正是为了优化这些关键方面。 2. **模式分类** - **Data Access Object (DAO)模式** DAO模式的主要意图是提供一个接口,隔离...
这个压缩包“EJB.rar”包含了五本关于EJB设计模式的书籍,这将为学习者提供深入理解EJB开发和设计的强大资源。 EJB设计模式是解决企业级应用开发中常见问题的最佳实践。设计模式是经过时间和实践验证的解决方案模板...
### EJB设计模式详解 #### 1. 概述 本文档主要介绍并解析了PetStore应用程序中所采用的企业JavaBeans (EJB) 设计模式。通过深入分析这些模式的实际应用,可以帮助读者更好地理解EJB架构及其在企业级Java开发中的...
门面模式,作为一种软件设计模式,是EJB(Enterprise Java Beans)中的一种经典模式,它在企业级应用开发中起到简化复杂系统接口的作用。EJB是Java编程语言中用于构建服务器端企业级应用的组件,它们是可分布式部署...