好学IT学院:IT信息技术分享交流平台
标签:J2EE  来源:BlogJava  作者:Lynn-Munsinger/草儿  发布时间:2009-02-03  ★★★加入收藏〗〖手机版
摘要:EJB3.0规范使开发EJB比过去更容易,可能诱惑你考虑开发第一个EJB。如果真是这种情况,那么祝贺你,你已经成功避免了在你以前EJB开发者的很多挫折,并且享受到EJB3.0开发的便利性。但是你开始开发以前,你可能想知道EJB是什么和它们用于什么目的。本篇文章…

EJB 3.0规范使开发EJB比过去更容易,可能诱惑你考虑开发第一个EJB。如果真是这种情况,那么祝贺你,你已经成功避免了在你以前EJB开发者的很多挫折,并且享受到EJB 3.0开发的便利性。但是你开始开发以前,你可能想知道EJB是什么和它们用于什么目的。本篇文章解释了EJB的基础和你如何在一个J2EE程序中使用它们。

什么是EJB?

一个企业JavaBean (EJB)是一个可重用的,可移植的J2EE组件。EJB由封装了业务逻辑的多个方法组成。例如,一个EJB可以有包括一个更新客户数据库中数据的方法的业务逻辑。多个远程和本地客户端可以调用这个方法。另外,EJB运行在一个容器里,允许开发者只关注与bean中的业务逻辑而不用考虑象事务支持,安全性和远程对象访问等复杂和容易出错的事情。EJB以POJO或者普通旧的Java对象形式开发,开发者可以用元数据注释来定义容器如何管理这些Bean。

EJB类型

EJB主要有三种类型:会话Bean,实体Bean和消息驱动Bean。会话Bean完成一个清晰的解耦的任务,例如检查客户账户历史记录。实体Bean是一个代表存在于数据库中业务对象的复杂业务实体。消息驱动Bean用于接收异步JMS消息。让我们更详细的认识这些类型。

会话Bean

会话Bean一般代表着业务流程中象“处理订单”这样的动作。会话Bean基于是否维护过度状态分为有状态或者无状态。

无状态会话Bean没有中间状态。它们不保持追踪一个方法调用另一个方法传递的信息。因此一个无状态业务方法的每一次调用都独立于它的前一个调用;例如,税费计算或者转移账款。当计算税费额的方法被调用时,税费值被计算并返回给调用的方法,没有必要存储调用者为将来调用备用的内部状态。因为它们不维护状态,所以这些Bean是仅仅由容器管理。当客户端请求一个无状态的Bean实例时,它可以接收来自由容器管理的无状态会话Bean实例集中的一个实例。也因为无状态会话Bean能够被共享,所以容器可以维护更少数量的实例来为大量的客户端服务。简单地象该Bean增加元注释@Stateless 来指定一个 Java Bean作为一个无状态会话Bean被部署和管理。

一个有状态的会话Bean维护一个跨越多个方法调用的会话状态;例如在线购物篮应用。当客户开始在线购物时,客户的详细信息从数据库获得。相同的信息对于当客户从购物篮中增加或者移除商品等等操作时被调用的其他方法也是可访问的 。但是因为该状态不是在会话结束,系统崩溃或者网络失败时保留,所以有状态会话Bean是暂时的。当一个客户端请求一个有状态会话Bean实例时,客户端将会得到一个会话实例,该Bean的状态只为给客户端维持。通过向方法增加元注释@Remove来告诉容器当某个方法调用结束一个有状态会话Bean实例应该被移除。

会话Bean实例

import javax.ejb.Stateless.*;

/**
* 一个简单无状态会话Bean实现了CalculateEJB接口的incrementValue()方法
**/

@Stateless(name="CalculateEJB")
public class CalculateEJBBean
implements CalculateEJB
{
int value = 0;
public String incrementValue()
{
value++;
return "value incremented by 1";
}
}

实体Bean

实体Bean是管理持久化数据的一个对象,潜在使用一些相关的Java对象并且可以依靠主键被唯一识别。通过包括@Entity 元注释来指定一个类是一个实体Bean。实体Bean表示来自数据库的持久化数据,例如客户表中的一个记录,或者一个员工表中的一个员工记录。实体Bean也可以被多个客户端共享。例如一个员工实体能够被多个计算一个员工每年工资总额或者更新员工地址的客户端使用。实体Bean对象特定变量能够保持持久化。实体Bean中所有没有@Transient 元注释的变量需要考虑持久化。EJB3.0的一个主要特色是创建包含使用元数据注释的对象/关系映射实体Bean的能力。例如,指定实体Bean的empId变量映射到employee表中的EMPNO属性,象下面实例中一样用@Table(name="Employees") 注释这个表的名字和用@Column(name="EMPNO")注释empId变量。另外,EJB3.0中的一个特色是你可以很容易的在开发时测试实体Bean,可以用Oracle Application Server Entity Test Harness在容器外部运行一个实体Bean。

实体Bean实例

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Collection;

@Entity
@Table(name = "EMPLOYEES")
public class Employee implements java.io.Serializable
{
private int empId;
private String eName;
private double sal;

@Id
@Column(name="EMPNO", primaryKey=true)
public int getEmpId()
{
return empId;
}

public void setEmpId(int empId)
{
this.empId = empId;
}

public String getEname()
{
return eName;
}

public void setEname(String eName)
{
this.eName = eName;
}

public double getSal()
{
return sal;
}

public void setSal(double sal)
{
this.sal = sal;
}

public String toString()
{
StringBuffer buf = new StringBuffer();
buf.append("Class:")
.append(this.getClass().getName()).append(" :: ").

append(" empId:").append(getEmpId()).append(" ename:").

append(getEname()).append("sal:").append(getSal());
return buf.toString();
}
}

  • 好学考试H5触屏版开放内测
  • 好学触屏公众号虎力全开、杨帆起航!