在EJB的技术体系中,实体Bean充当维护数据持久性的角色。开发者可以利用实体Bean对关系型数据库中的数据进行管理,EJB容器会为实体Bean提供可靠的服务支持,使实体Bean拥有可靠的性能。下面首先介绍EJB容器结构和实体Bean在EJB容器中的生命周期。
3.1.1 EJB容器
EJB容器为开发者提供了维护EJB对象的环境。在面向客户端方面,EJB容器为EJB对象提供了客户端视图和接口,通过特定的传输协议可以实现EJB容器和客户端之间调用EJB对象的过程。在面向设备和资源方面,EJB容器对数据库、邮件服务器、事务服务、消息服务器等各种资源进行管理,使开发者不必或很少需要与这些资源直接发生关系。EJB在提供这些服务时,保证了EJB对象的稳定性,而且通过EJB容器内的一些机制对EJB对象的服务处理进行了优化。
EJB容器结构如图3-1所示。
EJB容器中包含3种EJB组件:实体Bean、会话Bean和消息Bean。
实体Bean的主要作用是维护数据的持久性;会话Bean可以提供实现业务逻辑的方法;消息驱动Bean是基于Java消息技术的EJB对象,可以与JMS程序相配合,实现对消息队列的操作。
本章介绍实体Bean的开发方法,本书的第4章将介绍会话Bean的开发方法,第5章将介绍消息驱动Bean的开发方法。
图3-1 EJB容器的结构
3.1.2 实体Bean的生命周期
实体Bean是用来管理数据持久性的EJB组件,主要功能是管理与数据库之间发生的操作。每个实体Bean对应数据库表中的一行数据,建立或删除一个实体Bean相应会导致数据库表的一行记录被建立或删除。实体Bean的业务功能由开发者实现,或者由EJB服务器根据实体Bean的配置文件生成。
实体Bean的生命周期是由EJB服务容器负责维护的,同时每个实体Bean都需要实现javax.ejb.EntityBean接口,这个接口中的方法与实体Bean对象的状态有关,具体的接口方法如下:
public void ejbActivate()throws EJBException, RemoteException ;
public void ejbLoad()throws EJBException, RemoteException ;
public void ejbPassivate()throws EJBException, RemoteException ;
public void ejbRemove()throws RemoveException,EJBException,
RemoteException ;
public void ejbStore()throws EJBException, RemoteException ;
public void setEntityContext(EntityContext ctx)throws
EJBException,RemoteException ;
public void unsetEntityContext() throws EJBException,
RemoteException ;
实体Bean在EJB容器中有3种状态,包括不存在、正在池中缓存和准备就绪。
容器在创建实体Bean对象实例后,通过setEntityContext(ctx)方法将上下文传递给实体Bean对象,实体Bean进入缓存的状态,此时的实体Bean可以通过主接口提供一些方法,当实体Bean对象被激活进入就绪状态时,ejbActivate()方法被调用,此时实体Bean的对象与实体Bean的主接口相联系,可以提供相应的业务方法。在执行与数据库的交互时,容器通过ejbStore()和ejbLoad()两个方法来维护实体Bean状态。当实体Bean对象被返回到对象池之前ejbPassivate()方法被调用,同时实体Bean对象再次回到缓存的状态。当实体Bean对象对应的EJB对象被删除之前,实体Bean对象的ejbRemove()方法会被调用。当实体Bean被从对象池中删除时,unsetEntityContext()用来除去实体Bean对象中的上下文对象。
3.1.3 本地接口与远程接口
在EJB 2.0中,实体Bean能够提供的客户端视图有两种,一种是远程接口方式,另一种是本地接口方式。
当实体Bean发布远程接口方式时,调用实体Bean与客户端程序的位置是无关的,即使客户端程序与EJB容器位于同一Java虚拟机,对于调用过程来说,与客户端在远程的情况是一样的。EJB服务容器通过Java RMI技术来提供实体Bean的远程视图,在客户端调用实体Bean时将参数和结果在双方之间进行传递。
当实体Bean发布本地接口方式时,调用实体Bean的过程就有了很大的不同。最直接的影响是,位于EJB服务容器Java虚拟机以外的客户端程序无法调用到这个实体Bean。当实体Bean提供本地接口时,客户端与EJB服务容器之间不需要RMI来进行远程调用的过程,而是通过传递实体Bean对象的引用方式实现。
3.1.4 主接口与对象接口
EJB服务容器为每个实体Bean提供主接口和对象接口。当提供远程视图时扩展主接口(EJBHome)和远程对象接口(EJBObject),当提供本地视图时扩展本地主接口(NodeLocalHome)和本地对象接口(EJBLocalObject),它们的作用是不同的。
主接口的作用是向客户端提供创建实体Bean、查找实体Bean、删除实体Bean和执行主接口操作的方法。在主接口中可以提供若干个创建方法,方法名称是create(),其参数可以有多种排列方式,这些方法均返回实体Bean实例。主接口中还提供若干个查找方法,这些方法以“find”作为名称的前缀。查找方法可以由容器实现,也可以由实现类实现,这与实体Bean的类型和开发者的设计有关。主接口还提供了删除这个实体Bean的方法,由容器来执行。所以主接口是客户端与服务容器端之间实现交互的接口,客户端可以借助JDNI获取实体Bean的主接口,对于远程视图来说,可以通过如下的方法完成:
Context ctx = new InitialContext(env);
Object objRef = ctx.lookup("cmp/node");
NodeHome home = (NodeHome)
javax.rmi.PortableRemoteObject.narrow(objRef, NodeHome.class);
对于本地视图来说可以通过如下的方法完成:
Context ctx = new InitialContext(env);
Object objRef = ctx.lookup("cmp/node");
NodeLocalHome home = (NodeLocalHome)objRef ;
对象接口向客户端提供了实体Bean的主要业务方法,通过对象接口可以完成对数据的操作,也可以通过它得到主接口,或者删除实体Bean对象。
3.1.5 实体Bean的类型
实体EJB分为CMP和BMP两种,CMP的数据操作方法由开发者通过配置文件描述,由EJB容器提供实现,BMP的数据操作方法由开发者自己编写代码实现。
1.CMP类型的实体Bean
CMP(Container-Managed Persistence,容器管理持久性)类型的实体Bean是应用最多的实体Bean类型。它使开发者不必再去和复杂的JDBC API程序打交道,就可以完成高质量的数据库操作组件,并且在EJB 2.0标准中对CMP的内容进行了一些扩充,主要包括对EJB-QL的支持,对CMR(Container-Managed Relationships,容器管理的关系)的支持。
EJB-QL(EJB-Query Language,EJB查询语言)是基于SQL-92标准开发的用于EJB的查询语言,在EJB-QL语言中包括WHERE, FROM和SELECT字句等,开发者可以通过在EJB的部署描述文件中嵌入EJB-QL语句的方式,使EJB服务容器实现相应的查询方法。这减轻了开发者的任务。
CMR是EJB 2.0的特性,通过CMR的设定,使用容器的支持来实现实体Bean之间的关系,配合EJB-QL的支持时,CMP在处理数据查询方面的能力增强了。
本章在后续的内容中将通过实例介绍CMP的开发方法。
2.BMP类型的实体Bean
BMP(Bean-Managed Persistence,Bean管理持久性)类型的实体Bean是EJB中的另一种实体Bean类型。在BMP的实现方法中,需要借助于数据库API来实现对数据的操作。与CMP相比,BMP的优势在于可以更加灵活地提供数据库操作方法,特别是对于不支持使用CMP的数据库产品,BMP可以解决特殊的问题。
本章将通过实例来介绍BMP的开发方法。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-131573/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/374079/viewspace-131573/