开发 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 。