| |
前进:从EJB 2.1到EJB 3.0 |
|
时间: 2006-06-22 来自:天极开发 |
 |
|
迁移EJB实体Bean客户端
你可在实体bean主接口或本地主接口中使用create()方法,来创建一个EJB
2.1实体bean主对象或本地主对象。通常,一个EJB
2.1实体bean的客户端可通过JNDI查找来获取一个实体bean的本地或远程对象。下面有一段示例代码,其创建了一个EJB
2.1实体bean的本地主对象。
InitialContext ctx=new InitialContext(); Object
objref=ctx.lookup("BookCatalogLocalHome"); BookCatalogLocalHome
catalogLocalHome =
(BookCatalogLocalHome)objref; | 在上面的代码段中,BookCatalogLocalHome是BookCatalogBean实体bean的JNDI名。
在得到一个引用之后,EJB
2.1的客户端通过create()方法创建了一个本地对象。
BookCatalogLocal catalogLocal = (BookCatalogLocal)
catalogLocalHome.create(title); | 在EJB
2.1中,可通过查找方法,从一个本地主对象中取得一个本地或远程对象。例如,你可像如下所示通过findByPrimaryKey方法取得一个本地对象。
BookCatalogLocal catalogLocal = (BookCatalogLocal)
catalogLocalHome.findByPrimaryKey(title); | 另外在EJB
2.1中,可使用remove()方法移除一个实体bean的实例:
EJB
3.0通过javax.persistence.EntityManager类实现了持久性、查找和移除。表2列出了EntityManager类中用于取代EJB
2.1方法的一些常用方法。
表2:EntityManager类方法
| EntityManager方法 |
描述 |
| persist(Object entity) |
使一个实体bean实例持久化。 |
| createNamedQuery(String name) |
创建一个Query对象的实例,以执行命名查询。 |
| find(Class entityClass, Object primaryKey) |
查找一个实体bean实例。 |
| createQuery(String ejbQl) |
创建一个Query对象,以运行EJBQL查询。 |
| remove(Object entity) |
移除实体bean的一个实例。 | 在EJB
3.0实体bean的客户类中,可使用@Resource注释来注入EntityManager对象。
@Resource private EntityManager
em; | 可调用EntityManager.persist()方法来使一个实体bean的实例持久化,例如:
BookCatalogBean catalogBean = new BookCatalogBean
(title); em.persist(catalogBean); | 类似地,可调用EntityManager.find()方法来取得一个实体bean的实例。
BookCatalogBean catalogBean = (BookCatalogBean)
em.find("BookCatalogBean",
title); | 在此还可以定义一个相当于命名查询findByTitle的EJB
3.0客户类查找方法(与EJB 2.1中的查找方法可不一样),用createNamedQuery(String)方法取得一个Query对象。
| Query
query=em.createNamedQuery("findByTitle"); | 通过setParameter(int
paramPosition, String paramValue)或setParameter(String parameterName, String
value)方法设置Query对象的参数,注意此处的参数位置是从0开始的。
| query.setParameter(0,
title); | 使用Query.getResultList()方法取得BookCatalogBean对象的一个集合,如果确定查询只返回一个单一的结果,还可以使用getSingleResult()方法代替。
| java.util.Collection catalogBeanCollection =
(BookCatalogBean)query.getResultList(); | 最后,用EntityManager.remove(Object
entity)方法移除实体bean的实例。
BookCatalogBean
catalogBean; em.remove(catalogBean); | 例4演示了一个完整的EJB
3.0实体bean的无状态会话bean客户类。
例4:BookCatalogClient类
import javax.ejb.Stateless; import javax.ejb.Resource; import
javax.persistence.EntityManager; import
javax.persistence.Query;
@Stateless @Local public class
BookCatalogClient implements
BookCatalogLocal { @Resource private EntityManager
em;
public void create(String title) { BookCatalogBean
catalogBean=new
BookCatalogBean(title); em.persist(catalogBean); } public
BookCatalogBean findByPrimaryKey(String title) { return
(BookCatalogBean)em.find("BookCatalogBean", title); }
public
java.util.Collection findByTitle(String title) { Query
query=em.createNamedQuery("findByTitle"); query.setParameter(0,
title); return
(BookCatalogBean)query.getResultList(); }
public void
remove(BookCatalogBean
catalogBean) { em.remove(catalogBean); } } | 以上的示例演示了如何把一个会话bean和实体bean从EJB
2.1迁移到EJB 3.0,从EJB 2.0迁移的情况也与此类似。
在本文完稿时,已有一些应用服务器支持EJB
3.0规范,如JBoss应用服务器、Oracle应用服务器及Caucho应用服务器。不幸的是,这些应用服务器对EJB
3.0的实现会有所不同----它们可能没有实现全部的EJB
3.0特性,所以,在开始编写程序之前,一定要仔细阅读相关应用服务器提供的文档说明。
|
|
|
|
|
|
|
|