技术开发 频道

使用 Spring,JSF,EJB3 设计企业应用程序

  开发 EJB Project

  1.新建名称为 simpleEJB 的 EJB 工程,EJB Module version 为 3.0,Configuration 为 Default Configuration for JBoss v4.2,选中 Add project to anEAR,如下图:

  图 7. 新建 EJB 工程  

  点击 Next,取消选择 Create an EJB Clicent JAR,点击完成。

  2.新建名称为 org.zhouxing.simple. ProductDAOBean 的 Session Bean,如下图:

  图 8. 新建 Session Bean  

  选择生成 Local 和 Remote 接口。

  3.同时实现 Remote 与 Local 接口是一种比较好的做法。这样您既可以在远程访问 EJB,也可以在本地访问 EJB 。在本地接口中写出业务方法,远程接口继承本地接口的所有方法。代码如下:

  清单 3. Remote 与 Local 接口

本地接口:
package org.zhouxing.simple;
import java.util.List;

/**
本地接口
*
@author 周行
*/
public interface ProductDAOLocal {
    
/**
    查询所有的 Product
    @return
    
*/
    
public List<Product> findAll();
    
/**
    添加 Product
    @param product
    
*/
    
public void add(Product product);
}


远程接口:
package org.zhouxing.simple;

/**
远程接口
@author 周行
*/

public interface ProductDAORemote extends ProductDAOLocal{

}



无状态会话 BEAN
package org.zhouxing.simple;

import java.util.List;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
无状态会话 BEAN
*
@author 周行
*/
@Stateless
@Remote(ProductDAORemote.class)
@
Local(ProductDAOLocal.class)
public class ProductDAOBean implements ProductDAORemote,
    ProductDAOLocal {
    
/**
    注入 EntityManager
    
*/
    @PersistenceContext(unitName
= "simpleJPA")
    protected EntityManager em;

    
/**
    Default constructor.
    
*/
    
public ProductDAOBean() {
    
    }

    @Override
    
public void add(Product product) {
        em.persist(product);
    }

    @SuppressWarnings(
"unchecked")
    @Override
    
public List<Product> findAll() {
        Query query
= em.createQuery("select o from Product o");
        return query.getResultList();
    }

}

  @Stateless 注释指明这是一个无状态会话 Bean,@Remote 注释指定这个无状态 Bean 的 remote 接口。 Bean 类可以具有多个 remote 接口,每个接口之间用逗号分隔,如:@Remote ({ProductDAORemote.class,ProductDAORemote2.class,ProductDAORemote3.class}) 。如果您只有一个接口,您可以省略大括号,对于本文而言,可以写成这样:@Remote (ProductDAORemote.class) 。 @Local 注释指定这个无状态 Bean 的 local 接口,和 @Remote 注释一样,@Local 注释也可以定义多个本地接口。

  当 @Local 和 @Remote 注释都不存在时,容器会将 Bean class 实现的接口默认为 Local 接口。如果 EJB 与客户端部署在同一个应用服务器,采用 Local 接口访问 EJB 优于 Remote 接口。因为通过 Remote 接口访问 EJB 需要在 TCP/IP 协议基础上转换和解释 Corba IIOP 协议消息,在调用 EJB 的这一过程中存在对象序列化、协议解释、TCP/IP 通信等开销。而通过 Local 接口访问 EJB 是在内存中与 Bean 彼此交互的,没有了分布式对象协议的开销,大大提高了性能。

  @PersistenceContext 注释动态注入 EntityManager 对象。在 EJB 的 JNDI ENC 中注册一个指向该资源的引用。 EntityManager 是由 EJB 容器自动管理和配置的,这包括 EntityManager 的创

  建及清理工作。所以我们不需要调用它的 close() 方法释放资源, 如果您试图这样做, 反而会得到 IllegalStateException 例外。借助 EntityManager,我们可以创建、更新、删除及查询实体 bean 。 EntityManager 负责将固定数量的一组类映射到数据库中,这组类被称作持久化单元 (persistence unit) 。 persistence unit 是在 persistence.xml 中定义的。根据持久化规范的要求,该部署描述文件是必须提供的,如果不提供这一文件,则持久化单元也将不存在,因此应用也不能够获得和使用 EntityManager 。本文的持久化单元为simpleJPA 。

  至此 EJB Project 开发完毕,接下来是 WEB Project 。

0
相关文章