WEB开发网
开发学院软件开发Java Go-ForIt 记事:eXtreme DragonSlayers 专题报告,... 阅读

Go-ForIt 记事:eXtreme DragonSlayers 专题报告,第 9 部分: 避开继承的高“税收”

 2009-11-06 00:00:00 来源:WEB开发网   
核心提示: 实现委托我们使用 VisualAge for Java 版本 4.0 中的“EJB 开发环境”将 Personal Assistant 、 Customer 和 User 类实现为“容器管理持久性实体 Bean”(Container-Managed

实现委托

我们使用 VisualAge for Java 版本 4.0 中的“EJB 开发环境”将 Personal Assistant 、 Customer 和 User 类实现为“容器管理持久性实体 Bean”(Container-Managed Persistence Entity Bean)。 第 2 张图中的关联是使用 VisualAge for Java 的内置 EJB 关联支持完成的。在后面的文章中我们将详细讨论使用 VisualAge for Java 中的关联支持的机制。在这里我们只简要说一下我们执行的操作。

在创建 EJB 之后,我们使用 VisualAge for Java 的内置向导构建 EJB 之间的关联。对于一对一关联,开发者必须选择关联的哪一端持有代表另一端的外键(这会向下传给数据库模式)。在我们的例子中,我们选择让 PA 端持有 User 的外键,这样表中就会有一列代表持有 User 表主键的 PA。

VisualAge for Java 中的关联支持生成了一些代码,这些代码是用来管理向导所创建的关联所必需的大多数代码。在我们的例子中,方法 getUser() 和 setUser(..) 被添加到 PA 的远程接口,使得访问和更改关联的 User 很容易。实际上,对于两端都可选的一对一关联,只需要向导生成的代码就够了。但对于必需的关系,(比如 PA 与 User 关联这个要求),需要对代码进行一些额外的修改以确保当一个 PA 被创建时,它与现有的 User 是关联的。这意味着要提供一个对 User 对象的引用作为传递给 PA EJB 的 ejbCreate(...) / ejbPostCreate(..) 方法的参数。下面是所需要的一段代码。


实现代码示例
public void ejbCreate(PersonalAssistantDataBean argPaData, User argUser) 
 throws javax.ejb.CreateException, java.rmi.RemoteException { 
   
 _initLinks(); 
  // All CMP fields should be initialized here from the properties 
  // of the PersonalAssistantDataBean instance passed in by the 
  // client. PersonalAssistantDataBean is a wrapper around the 
  // the various Personal Assistant specific fields maintained for 
  // this type of user 
  
  .... 
   // Next we set the foreign key field using a method generated 
   // automatically when the association was created from the 
   // passed in remote interface of the associated User. 
 privateSetUserKey((UserKey) argUser.getPrimaryKey()); 
 
} 
public void ejbPostCreate(PersonalAssistantDataBean argPaData, User argUser) 
  throws java.rmi.RemoteException { 
   
  // The foreign key field is required to be set in ejbCreate() so 
  // the container can perform a database INSERT operation, however the 
  // field is required to be NULL for setUser() to work correctly when 
  // it (setUser) is called for the first time 
 privateSetUserKey(null); 
  // setUser() was added to the remote interface of the Personal 
  // Assistant EJB when the association was created via the wizard. 
  // Remote interface methods of an EJB are not available in the 
  // ejbCreate(..) methods so we have to wait until ejbPostCreate(..) 
  // is invoked before we can call them 
  setUser(argUser); 
} 

结论

通过在我们的设计难题中避开继承,我们这些“屠龙者”(DragonSlayer)就能够在 Go-ForIt 应用中避开一些额外的复杂性,还可以使得将来更容易更新。我们提醒在对继承的效用(也包括缺少继承)下一般结论时要小心。在 Go-ForIt 项目的许多部分,继承都得到了广泛的应用。但是,我们认为说明一种与继承相关的“税收” 过高的实际情况,并指导我们去寻找一种更容易、代价更低的解决方案还是很有用的。

上一页  1 2 3 4 

Tags:Go ForIt 记事

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接