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 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 项目的许多部分,继承都得到了广泛的应用。但是,我们认为说明一种与继承相关的“税收” 过高的实际情况,并指导我们去寻找一种更容易、代价更低的解决方案还是很有用的。
- ››Godaddy域名解析使用DNSPOD方法
- ››GOV.CN域名解析修改
- ››Google搜索引擎的奥秘
- ››Google测试搜索结果页面右侧内容更丰富的信息栏
- ››Google Dart精粹:应用构建,快照和隔离体
- ››google的代码审查
- ››google analytics清晰追踪爬虫的爬行信息
- ››Google+中文用户在两千万Google+大军中是少数派
- ››Google AdWords最昂贵点击成本的20种关键词分类
- ››Google运作经理Bryan Power给出的GOOGLE求职意见
- ››Google用户体验的十大设计原则
- ››Google Analytics(分析)能为网站带来什么
更多精彩
赞助商链接