`
hanxinyu
  • 浏览: 127276 次
  • 来自: henan china
社区版块
存档分类
最新评论

J2EE EJB3.0 Specification 开发

阅读更多
简介

J2EE架构中的EJB框架是多层架构(multi-tier architecture) 所提供的服务机制(简称后台),而EJB也是J2EE讨论中离不开的题目。在J2EE的整个发展过程当中,EJB可以大概分为两个主要的版本,分别是2.1与3.0. 简单的说,EJB2.1对开发者的规范要求是非常多的,相反,在EJB 3.1的环境中开发就变得简单得多。WEBSTONE的DRP第二个版本开发将会采用EJB3为后台的开发基础。本文是针对EJB3.0而写的,所以不会包含EJB2.1的讨论。如果有兴趣可以在网上找到很多相关的资料。

EJB

EJB也是Enterprise Java Bean 的简称。EJB分为以下三种: 对话(Session) 、实体(Entity) 和消息(Message Driven) Bean。Session bean 实现企业的业务逻辑(business logic)。Entity bean 代表业务对象(business object)。MDB 是用来处理和消化ASYNC MESSAGE。

EJB3的特点

 基于Java POJO
 简化了对HIBERNATE的操作,更不需要DAO设计
 简化了MODEL与ENTITY之间的转换


例子一、  尺码管理

尺码组(Size Group)与尺码(Size) 是服装的基础信息之一。它们之间的关系是一对多。尺码组的名称和序号必须是唯一;每个尺码组中的尺码名称和序号也必须是唯一的(见下图)

(一般而言服装公司的尺码是不容易变动的。把尺码信息存放在数据库中的目的是方便维护。系统起动后尺码信息该从Enumeration 来读取)

A S M L XL
B 44 46 48 50 52
C 70 72 74
图一、服装尺码


图二、尺码对象分析




(Class) 属性
(Attributes) 数据类型
(Data Type) 说明 规则
Size
id Long 主键 系统自动生成
name String 尺码名称 不能为空
order int 尺码的次序 >0 && <尺码总数
SizeGroup id Long 主键 系统自动生成
name String 尺码组名称 不能为空
startPos int 尺码的开始位置 >=0 && <尺码总数 – 1
order int 尺码组次序 >0 && <尺码组总数
表一、尺码/组数据字典

尺码组与尺码用Entity Bean来实现

尺码管理有以下的用例:

用例用session bean来实现

构建Entity bean

在定义了类之间的关系后,我们便可以开始构建Entity bean.



Size.java (POJO with annotation):

@Entity
@Table(
name = "MASTER_SIZE",
uniqueConstraints={@UniqueConstraint(columnNames={"seq", "name", "fk_sg_id"})}
)
public class Size implements Serializable{

private static final long serialVersionUID = 1L;

private Long id;
private int seq;
private String name;
private SizeGroup sizeGroup;

public Size () {

}

public Size (String name, int seq, SizeGroup sg){
this.setSeq(seq);
this.setName(name);
this.setSizeGroup(sg);
}

public int getSeq() {
return seq;
}

public void setSeq(int seq) {
this.seq = seq;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the id.
*/
@Id
@GeneratedValue
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}
@ManyToOne
@JoinColumn (name="fk_sg_id")
public SizeGroup getSizeGroup() {
return sizeGroup;
}
public void setSizeGroup(SizeGroup sizeGroup) {
this.sizeGroup = sizeGroup;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Size order:")
.append(seq)
.append(" name:")
.append(name)
.append(" group:")
.append(sizeGroup.getName());
return sb.toString();
}
}

程序员对Java POJO不会感到迫生,可是对于以“@”符号为开头的语句可能感到不太习惯。这些符号代表的是注解(ANNOTATION)。注解是在JDK1.5开始所加入的一个新特性,在这里起到了简化XML的作用。



在Size这个类有几点我们要注意的。
1. @Entity  标示这个POJO是一个实体bean
2. @Table  标示这个实体所对应的表名和属性 (MASTER_SIZE)
3. @UniqueConstraint  标示这个实体必须是唯一的属性
4. @Id  与数据库设计一样,每个实体都必须有一个主键。而SizeBean的主键是id。
5. @ManyToOne  Size与SizeGroup之间的关系是多对一,用栏位fk_sg_id来关连。

就这样便完成了Size这个实体bean的构建了。SizeGroup与Size大同小异。

SizeGroup.java :

@Entity
@Table(
name="MASTER_SIZE_GROUP",
uniqueConstraints={@UniqueConstraint(columnNames={"namexxx"})}
)
public class SizeGroup implements Serializable{

private static final long serialVersionUID = 1L;

private Long id;
private int seq;
private String name;
private int startPos;
private Collection<Size> sizes;
…..
@OneToMany (mappedBy="sizeGroup", fetch=FetchType.LAZY)
public Collection<Size> getSizes() {
return sizes;
}
}

一个SizeGroup 可以有多个Size。所以Size是一个集成 Collection. 而且在getSizes()要用@OneToMany来说明这是个一对多的关系。

以下是在EJB3常用到的ANNOTATION:

@Entity  (表示一个实体BEAN)
@Stateless  (表示一个无状态的对话BEAN)
@Stateful  (表示一个有状态的对话BEAN)
@Table  (表示实体BEAN对应在DB中的表名和其他属性)
@Id (表示实体BEAN的主键 primary key)
@GeneratedValue  (主键产生方法)
@ManyToOne (实体之间多对一的关系描述)
@OneToMany (实体之间一对多的关系描述)
@OneToOne (实体之间一对一的关系描述)
@ManyToMany (实体之间一对一的关系描述)
@Remote (表示remote接口)
@Local  (表示本地接口)



构建Session bean

实体建立后,我们便可以开始构建业务逻辑。





Session bean由接口和bean所组成。

接口(API)定义了业务逻辑的输入和输出。 接口是采用Java interface来定义的.

远程(Remote) &本地(Local) 接口
J2EE有两种调用EJB的方法,分别是本地(Local) 和远程(Remote) 调用。它们的分别是远程调用要通过RMI的转换,而本地调用就不需要。为了提高性能,一般的WEB应用都会建议使用本地调用。可是为了方便未来的需要,SizeBean同时实现了两种接口。

跟据上文的用例分析,我们得出以下的API:

package com.wst.drp.fashion.svc;
import java.util.Collection;
import com.wst.drp.fashion.entity.Size;
import com.wst.drp.fashion.entity.SizeGroup;

public interface SizeService {

/**
* Add a new size group.
* @param name Size group name must be unique
* @param order Size group order must be unique
* @throws  SizeServiceException if size group name already exist
*/
public void addSizeGroup (String name, int order)
throws SizeServiceException ;

/**
* Create a new size group & set the order to maximum order + 1
*
* @param name Size group name must be unique
* @throws SizeServiceException if size group name already exist
*/
public void addSizeGroup (String name)
throws SizeServiceException;

/**
* Returns a size group
*
* @param groupId
* @return null if not found
*/
public SizeGroup getSizeGroup(Long groupId);

/**
* Create a new size
*
* @param name Size name must be unique
* @param order Size order
* @param groupId
* @throws SizeServiceException if size name already exist
*/
public void addSize(String name, int order, Long groupId)
throws SizeServiceException ;

/**
* Create a new size & set the order to maximum order + 1
* @param name
* @param groupId
* @throws SizeServiceException if size name already exist
*/
public void addSize (String name, Long groupId) throws SizeServiceException ;

/**
* Return a size
* @param sizeId
* @return
*/
public Size getSize (Long sizeId);

/**
*
* @return
*/
public Collection<SizeGroup> getAllSizeGroups();

/**
*
* @param groupId
* @return
*/
public Collection<Size> getSizesOfGroup(Long groupId);

/**
* Returns max group size
* @return
*/
public int getMaxGroupSize();

/**
* Returns min group size
* @return
*/
public int getMinGroupSize();

/**
* Delete a size group
* @param groupId
* @throws SizeServiceException if 'groupId' does not exist
*/
public void deleteSizeGroup(Long groupId) throws SizeServiceException ;

/**
* Delete a size
* @param sizeId
* @throws SizeServiceException if 'sizeId' does not exist
*/
public void deleteSize(Long sizeId) throws SizeServiceException;

}

Session API的设计

业务系统API主要是实现业务逻辑,而API设计的种点是简单化、清晰和独立操作。另外,API设计的好与坏也决定于需要处理的数据量,如果要返回过多数据或者中间需要经过多次转换,对维护和性能会带来重大影响。

package com.wst.drp.fashion.ejb;
// ignored import statements

@Stateless
public class SizeBean implements SizeServiceLocal, SizeServiceRemote {
   @Persistence Context (unitName = "abcdb")
   private EntityManager em;

public void addSizeGroup(String name, int order, int startPos)
throws SizeServiceException {

if (name == null || name.equals("")) {
throw new SizeServiceException ("尺码组名称不能为空");
}

if (this.containsSizeGroupWithName(name)) {
throw new SizeServiceException ("尺码组名 '" + name + "' 已存在");
}

// assert order < 0
// assert startPos < 0

SizeGroup newSG = new SizeGroup (name, order, startPos);
em.persist(newSG);
}

// 判断组名name是否已经被使用
private boolean containsSizeGroupWithName (String name) {
List list = em.createQuery(
        "from SizeGroup sg where sg.name = :name")
         .setParameter ("name", name)
         .getResultList();
if (!list.isEmpty()) {
return true;
}
return false;
}
…..
}

@Stateless 说明了这是一个无状态的session bean
@Persistence 指向持久配置设定

从需求中我们知道尺码组的名称不可以相同,所有在进行addSizeGroup()方法前我们要判断name是否已经被使用。如果已被使用,程序就要抛出异常通知用户端并说明原因。

containsSizeGroupWithName()方法是用来判断组名name是否已经被使用。这个方法采用了EJBQL语法来查询数据库。EJBQL的语法与Hibernate 的查询语法很相似。这种查询方法在开发应用时常常用到。

如果组名没有被使用,便可以增加组。操作和Hibernate 的操作是一样的。创建一个新的对象,然后再通过EntityManager来持久到数据库中。EntityManager 就同等于Hibernate里的HibernateSession。

你也许发现EntityManager 是不用创建或者通过某些方法来获取的。其实是因为使用了@PersistenceContext的注解声明:

   @PersistenceContext(unitName = "abcdb")
   private EntityManager em;

在JBOSS中EntityManager是由EJB容器根据用户配置的data source为entity beans提供entityManager实例,所以,用注解声明persistenceContext(unitName=”datasource name”) 详情可以参考 “Webstone JBOSS EJB3 Development Guide”


客户端(Client)
Work in progress

小结:

你可能会发现采用EJB架构的优点是简单化很多设计的工作,包括对DAO层和ENTITY-TO-MODEL的设计要求。以下让我们再来看看怎样用EJB架构来设计业务系统。

例字二  -  款式管理

款、色、码是服装的三个基本原素。款和色、码之间的关系是多对多。换句话说,一个款可以有多个颜色,同一个颜色可以重复在不同的款中。虽然一个款可以有多个尺码,可是也局限於一个尺码组中的尺码。下图说明了款、色、码、尺码组之间的关系和属性的规则。


图三、款式定义


(Class) 属性
(Attributes) 数据类型
(Data Type) 说明 规则
Style
id Long 主键 系统自动生成
no String 款号 必须唯一
name String 款名 不能为空
Color id Long 主键 系统自动生成
no String 色号 必须唯一
name String 色名 不能为空
分享到:
评论

相关推荐

    EJB3.0规范-EJB3.0 SPECIFICATION

    EJB3.0规范是Java EE 5中的一个重要组成部分,它对之前的EJB版本进行了重大改进,极大地简化了开发流程,降低了EJB的使用门槛。 EJB3.0规范引入了许多关键特性,使得企业级开发变得更加高效和直观: 1. **注解驱动...

    ejb3.0开发实例(java工程)

    在这个"ejb3.0开发实例(java工程)"中,我们将深入探讨EJB 3.0的主要特性和开发实践。 1. **注解驱动**:EJB 3.0最大的变革之一就是大量使用注解(Annotation),减少了XML配置文件的使用。例如,@Stateless、@...

    ejb3.0开发规范PDF

    EJB(Enterprise JavaBeans)3.0是Java企业级应用开发的一个重要标准,它定义了如何在Java EE(Java Platform, Enterprise Edition)环境中构建可复用的、组件化的服务器端应用程序。EJB 3.0的发布极大地简化了EJB的...

    EJB3.0入门经典(PDF)

    《EJB3.0入门经典》是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。《EJB3.0入门经典》内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发...

    ejb3.0入门图文教程

    首先,我们来看《EJB3.0开发Entity.pdf》。在EJB 3.0中,Entity Bean代表持久化对象,它存储在数据库中并与数据库进行交互。这个部分将介绍如何定义实体bean,包括使用JPA(Java Persistence API)来注解实体类,...

    精通EJB3.0 pdf

    该书为读者提供了全面且深入的EJB3.0知识体系,旨在帮助软件开发人员掌握这一重要的企业级Java开发框架。 ### EJB3.0简介 EJB(Enterprise JavaBeans)是Java平台为企业级应用提供的一套标准组件模型。自1998年...

    EJB3.0开发文档

    EJB3.0是EJB规范的一个重大改革版本,它极大地简化了开发流程,降低了入门门槛,使其更加符合现代开发模式。本开发文档将深入讲解EJB3.0的关键特性和最佳实践。 一、实体Bean(Entity Beans) 在EJB3.0中,实体Bean...

    Java之精通EJB3.0.pdf

    1. **简化编程模型:**EJB3.0引入了许多新的特性来简化开发过程,例如使用注解来替代XML配置文件,这大大减轻了开发者的负担。 2. **容器管理实体Bean(CMB):**EJB3.0中引入了容器管理实体Bean(CMB),它支持持久...

    EJB3.0+JBOSS+MyEclipse初体验(完整代码和过程)

    在"**EJB3.0+JBOSS+MyEclipse初体验(完整代码和过程).txt**"文件中,你将找到一个完整的示例,涵盖了上述所有步骤,包括具体的代码片段和执行过程,这对于初学者来说是一个很好的起点,可以快速理解并实践EJB 3.0在...

    EJB3.0API.rar_ejb_ejb3.0a_ejb3.0api

    EJB 3.0 API是EJB技术的一个重要版本,它在前几版的基础上进行了重大改进,极大地简化了开发过程,降低了学习曲线,提升了开发效率。 EJB 3.0 API引入了若干关键特性,如: 1. **注解驱动(Annotation-Based)**:...

    《EJB 3.0入门经典》 源码

    在"ejb3.0入门经典教程-source"这个压缩包中,包含了书中各个章节的示例代码,覆盖了EJB 3.0的各个方面,例如实体Bean的创建、会话Bean的使用、事务管理、安全性设置以及JPA的持久化操作等。这些源码对于初学者来说...

    EJB 3.0实例教程.pdf

    EJB 3.0是EJB规范的一个重大革新,它极大地简化了EJB的开发过程,引入了许多面向开发者友好的特性,如注解、依赖注入以及更轻量级的架构。 **1. 注解驱动的开发** 在EJB 3.0之前,开发者需要编写大量的XML配置文件...

    李腾飞EJB3.0 源码 源代码

    "李腾飞EJB3.0 源码 源代码"可能包含的是李腾飞教授或团队关于EJB 3.0技术的实践示例或教学资源。通过分析这些源码,开发者可以深入理解EJB 3.0的实现细节,例如如何使用注解定义Bean、如何处理持久化、如何进行依赖...

    EJB 3.0 Specification (JPA 1.0)

    EJB 3.0是EJB规范的一个重要里程碑,它引入了许多简化开发的特性,使得EJB更加易用,同时也保持了其强大的功能。 在EJB 3.0中,主要关注的改变包括: 1. **注解驱动的开发**:EJB 3.0极大地减少了XML配置文件的...

    EJB3.0实例教程(PDF)

    **EJB3.0实例教程**是一份详细指导开发者如何使用Enterprise JavaBeans 3.0(EJB3.0)技术进行企业级应用开发的电子文档。EJB3.0是Java EE(Java Platform, Enterprise Edition)规范的一部分,旨在简化企业级组件的...

    EJB3.0架包

    EJB3.0是EJB规范的一个重要版本,它在EJB2.x的基础上进行了大量简化,提高了开发效率,并引入了注解驱动的开发方式,使得EJB更易于理解和使用。 在EJB3.0中,主要包含以下关键知识点: 1. **实体Bean(Entity ...

    EJB3.0入门经典源代码.part1

    本书是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。  本书内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发技术的同时,精心设计了与...

    ejb2.0与ejb3.0的区别

    ### EJB2.0与EJB3.0的主要区别 #### 一、简介 企业Java Beans(EJB)是Java平台为企业级应用提供的一种组件模型。随着技术的发展,EJB经历了多个版本的迭代,其中EJB 2.0和EJB 3.0是两个重要的里程碑版本。本文将...

    EJB 3.0入门经典 源码

    本书是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。  本书内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发技术的同时,精心设计了与...

    传智播客EJB3.0_EJB3.0企业开发_Jboss_ppt_pptx_黎活明.rar

    2、传智播客EJB3.0.ppt--&gt;是以《传智播客EJB3.0.pptx》为源文件的简单复制与粘贴后的结果,其格式与源文件有些不同,更为简洁,但没有源文件美观。该文件office 97 - office 2003及以上版本都能打开。 下载资源后...

Global site tag (gtag.js) - Google Analytics