新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 软件开发 > Web开发 > JSP教程 > 正文:利用EJB 3.0的JPA设计企业应用程序详解

利用EJB 3.0的JPA设计企业应用程序详解

新客网 XKER.COM 2007-07-06 来源: dxaw 收藏本文

本文将介绍Java Platform,Enterprise Edition(Java EE 5)的一种设计方法,它利用了Enterprise JavaBeans(EJB) 3.0 新的Java Persistence API (JPA)。JPA 提供了一种标准的对象关系映射解决方案,该解决方案避免了依赖第三方框架(如 Hibernate)。您将看到示例应用程序的详细内容,其中验证了本方法并阐明关键设计决定。

期待已久的下一版本Java EE 5即将发布。Java EE 5许多新功能都包含经过修补的EJB架构,其突出特性之一是JPA。由于具有容器内和容器外持久性选项,JPA 为 J2EE 架构师带来一系列全新设计选择。本文将着重介绍容器内应用程序的设计,此类应用程序依赖EJB容器提供企业服务,如事务处理和安全性。

我将使用您熟悉的PetStore应用程序进行测试,以证明JPA的功能以及它如何向传统J2EE设计模式发起挑战。本应用程序比较琐碎,所以不提供详尽的实现细节。我将用代码摘录对设计注意事项进行说明。本文假设您熟悉EJB 3.0基本概念和对象关系(OR)映射基本概念。

设计概述

示例PetStore应用程序是基于Web的电子交易应用程序,它实现以下用例:

◆浏览产品

◆查找产品

◆维护账户

◆维护购物车

◆创建订单

本应用程序被设计为具有三个主要逻辑层的多层Java EE应用程序:

◆表示层(并非本文的重点)使用 Struts 框架。

◆服务层是一种简单的服务facade,将所有工作委托给其协作者。服务层的目的是分离服务供应与服务实现。

◆数据访问层是一系列作为无状态会话bean实现的粗粒度Data Access Objects (DAO)。出于持久性的需要,它们都依赖 Java 持久性实体管理器。

应用程序域模型由EJB 3.0实体bean表示并用于层间的通信。当域对象离开数据访问层时,它与实体管理器脱离。当重新进入数据访问层时,它需要重新连接到实体管理器。

注释似乎是Java 5的一个广泛采用的特性,JPA也不例外。注释可用于指定OR映射——在dW文档和教程中您经常可以看到——而PetStore应用程序出于相同目的使用它们。然而值得一提的是您还能通过映射文件的方式指定OR映射。本文稍后的OR映射 一节将探讨并比较这两种可选方式。

我在Jboss应用服务器中开发并部署PetStore应用程序(参见 参考资料)。我使用商用数据库完成大多数开发工作并将应用程序后端移植到 PostgreSQL数据库(OR映射 一节包含了关于使用JPA时您应该了解的数据库迁移的潜在影响的讨论)。

本案例分析的目的之一是符合设计标准,允许高度可测试的实现。如 测试 一节所见,您能够使用一系列测试技术来测试PetStore应用程序。

PetStore 应用程序充分利用了这一事实:它是规则的 Web 应用程序。主要优点是所有层能够运行在相同的 JVM中,免除了组件分发的需要。本文的 远程处理 一节简要介绍了为应用程序添加远程处理功能的方法。

服务层

服务层被设计为服务facade。它由PetStoreService这一无状态会话bean实现。Bean要完全依靠其协作者来提供Web服务。

因为简化的PetStore要求被限定于从数据库检索数据并把数据存储于数据库,惟一的协作者就是DAO。真正的应用程序能够调用Web服务,通过 RMI/IIOP或资源适配器访问其他应用程序,并生成电子邮件消息等。所有此类型的功能都需要其他协作者支持。

可通过@EJB或@Resource注释注入协作者(如清单 1 所示)或通过@PostConstruct方法注入协作者(如清单 2 所示):

清单 1. 使用 @EJB 注入协作者

@EJB(beanName = "AccountDao") AccountDao accountDao;

清单 2. 使用 @PostConstruct 注入协作者

MessageSource messageSource; @PostConstruct public void init() { messageSource = new MessageSourceImpl("exceptions"); }

选择bean实现类的测试策略的主要因素是类完全依赖协作者来提供服务。这意味着类和协作者的交互作用需要被验证。正如您在 测试 一节看到的,模仿对象方法完全满足该目标。

数据访问层

数据访问层被设计为一系列粗粒度的DAO。DAO被实现为无状态会话bean,一个bean对应一个逻辑域:AccountDao、OrderDao和 ProductDao。

每个 bean 都要把实体管理器注入到其中:

@PersistenceContext(unitName = "manager1") protected EntityManager em;

这是应用程序中持久性调用类(persistence-aware) 最多的层。它广泛使用全新的Enterprise JavaBeans Query Language(EJB QL)。所有持久性相关的行动都在该层发生,例如:

profile = (UserProfile) em.createQuery("from UserProfile up where up.login = :login").setParameter( "login", login).getSingleResult();

下面是另一个例子:

em.persist(account);

事实上这些类是持久性调用类(persistence-aware),需要一种容器内测试策略,这将在 测试 一节进行描述。

域模型

您可以把JPA看作是众所周知的透明持久性技术(如JDO和Hibernate)的继承者。尽管透明持久性可看作一个附加(add-on)服务,可被应用到忽略持久性的Plain Old Java Objects (POJO)中,但JPA还是对域对象施加了少量限制。

首先,您通常要具有一个映射到对应数据库表主键的(代理)对象标识符:

@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AccountSeq") @Column(name = "account_sysid") public Integer getAccountId() { return this.accountId; }

其次,在联机事务过程(OLTP)环境中,需要一个 version 字段或 JavaBean 属性以进行乐观并发控制:

@Column(name = "row_version") @Version public int getVersion() { return version; }

最终,如果您选择使用注释方式的映射,映射注释将分布在代码周围。

共2页: 上一页 [1] [2] 下一页
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
阅读排行
随机推荐
实用信息推荐