您的位置:首页 > 其它

会话bean调用实体bean(同一工程目录下)

2009-04-13 15:56 465 查看

定义Remote接口

编写SessionBean首先要定义一个远程的接口,接口中封装了SessionBean中的业务逻辑。本例中定义的远程接口中定义了新建实体、删除实体、更新实体和根据id查找实体的方法。该远程接口的代码如下所示。

ICustomerService.java

package com.fengmanfei.jpa.bo;
import java.util.List;
import javax.ejb.Remote;
import com.fengmanfei.jpa.entity.CustomerEO;
@Remote
public interface ICustomerService {
/** 新建实体 */
public void save(CustomerEO
transientInstance);
/** 删除实体 */
public void delete(Integer id);
/** 更新实体 */
public CustomerEO
update(CustomerEO detachedInstance);
/** 根据id查找实体 */
public CustomerEO
findById(Integer id);
/**查询所有的实体*/
public List<CustomerEO>
findAll ();
}
接口中标注的@Remote表示这是一个远程调用的接口。EJB容器会根据这个注释将该接口设置为可远程调用的接口。
★ 提示

本书中定义的远程接口都是形如IXXXService的格式,其中I表示接口,Service表示某一业务的服务。例如涉及对Customer的业务逻辑,这里命名为ICustomerService。


SessionBean有无状态(Stateless)和有状态(Stateful)两种类型。在EJB 3.0中,开发会话Bean只需要使用标注就可以设置Bean的类型。
下面编写一个无状态的SessionBean,该Bean实现了远程接口ICustomerService,它的代码具体如下所示。

CustomerService.java

package
com.fengmanfei.jpa.bo.impl;
import java.util.List;
import
javax.ejb.Stateless;
import
javax.persistence.EntityManager;
import
javax.persistence.PersistenceContext;
import
javax.persistence.Query;
import com.fengmanfei.jpa.bo.ICustomerService;
import
com.fengmanfei.jpa.entity.CustomerEO;
@Stateless
public class
CustomerService implements ICustomerService {

@PersistenceContext(unitName = "demo")

private EntityManager entityManager;

public void save(CustomerEO transientInstance) {
/** 持久化实体 */
entityManager.persist(transientInstance);
}

public void delete(Integer id) {
/** 删除实体 */
CustomerEO
instance = this.findById(new Integer(1));
entityManager.remove(instance);
}

public CustomerEO update(CustomerEO detachedInstance) {
/** 更新实体 */
CustomerEO
result = entityManager.merge(detachedInstance);
return
result;
}

public CustomerEO findById(Integer id) {
/** 根据主键查找实体 */
CustomerEO
instance = entityManager.find(CustomerEO.class, id);
return
instance;
}

public List<CustomerEO> findAll() {
/**查询EQL*/
String sql =
"SELECT c FROM CustomerEO c";
Query
query = entityManager.createQuery(sql);
return
query.getResultList();
}
}
可以看到该SessionBean实现了ICustomerService远程接口,并使用@Stateless注释标注该类是一个无状态的Bean。

3.3 使用EntityManager操作实体

顾名思义,实体管理器EntityManager是负责管理Entity的对象。对Entity的操作包括添加、删除、修改和查询,都是通过实体管理器来实现的。

3.3.1 依赖注入EntityManager

在EJB容器中,EntityManager的获得可以通过标注,使用依赖注入来创建EntityManager实例,代码如下所示。
@PersistenceContext(unitName =
"demo")
private EntityManager entityManager;
@PersistenceContex
表示标注的属性entityManager是一个实体管理器EntityManager对象,EJB容器会根据unitName的值来初始化
EntityManager。其中unitName的值为上文中在persistence.xml中配置的<persistence-
unit>中name的值。
虽然这里没有看到new实体管理器EntityManager的代码,但一旦将该类放置到EJB容器中,容器将会自动依赖注入,初始化该实例。

3.3.2 添加Entity

EntityManager类中的persist方法可以在数据库中添加一条记录,其声明如下所示。
public void persist(Object entity)
示例代码如下所示。
CustomerEO customer = new
CustomerEO();
customer.setId(1);
customer.setName("Sun
System");
customer.setShortName("Sun");
entityManager.persist(customer);

3.3.3 根据主键查找Entity

EntityManager类中的find方法可以根据主键的值查找对应的实体。
public <T> T find(Class <T>
entityClass, Object primaryKey);
其中,entityClass为实体对象,primaryKey为主键的值。例如,查找id为1的实体代码如下所示。
CustomerEO instance =
entityManager.find(CustomerEO.class, new Integer(1));

3.3.4 更新Entity

EntityManager类中的merge方法可以将实体更新到数据库中,其声明如下所示。
public <T> T
merge(T entity);
其中,entity为所要更新的实体对象,可以通过find方法先查找出来,然后重新设置值后,最后更新。例如,更新id为1的实体代码如下所示。
CustomerEO customer =
entityManager.find(CustomerEO.class, new Integer(1));
customer.setName("New
Name");
customer.setShortName("New
Short Name");
entityManager.merge(customer);

3.3.5 删除Entity

EntityManager类中的remove方法可以删除数据库中的一条记录,其声明如下所示。
public void remove(Object entity);
其中,entity为所要删除的实体对象,可以通过find方法先查找出来,然后删除。例如,删除id为1的实体代码如下所示。
CustomerEO customer =
entityManager.find(CustomerEO.class, new Integer(1));
entityManager. remove
(customer);

3.3.6 执行查询

EntityManager类中的createQuery方法可以查询数据,并返回查询结果集,其声明如下所示。
public Query
createQuery(String queryString);
其中,queryString为查询的SQL语句。例如,查询所有的CustomerEO可以使用以下代码。
String sql =
"SELECT c FROM CustomerEO c";
Query query =
entityManager.createQuery(sql);
List result = query.getResultList();

3.4 部署EJB

开发完成所需要的类后,要将所有编译后的.class文件打成EJB的JAR包,然后部署到EJB容器中。

3.4.1 打EJB-JAR包

本例中将所有的配置文件和编译后的类文件,按照一定的目录结构打成demoEJB.JAR包,打包后的包结构如图3-2所示。



图3-2 打成EJB-JAR包后的目录结构示意图
其中,配置该包实体所对应的persistence.xml文件必须保存在META-INF文件目录下。
★ 提示

打成EJB-JAR包的方式有多种,可以使用Ant进行打包,也可以使用Eclipse的导出向导进行打包,也可以使用JBoss IDE提供的打包功能进行打包。如何打包的内容请读者参阅本书第13章相关内容。

3.4.2 部署EJB

部署EJB-JAR包只需要将打包后的
demoEJB.JAR复制到应用服务器的部署目录下,例如使用JBoss服务器,JBoss服务器的部署目录是JBOSS_HOME/server
/default/deploy,所以此时只需要将demoEJB.JAR复制到该文件目录下。
JBoss目录下,除了可以部署EJB的JAR包,还可以部署WAR包、EAR包等。当服务器启动时,服务器将会加载deploy目录下所部署的类包。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐