EJB之会话Bean、实体Bean_第1页
EJB之会话Bean、实体Bean_第2页
EJB之会话Bean、实体Bean_第3页
EJB之会话Bean、实体Bean_第4页
EJB之会话Bean、实体Bean_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会话bean 生命周期有状态的1 客户(create )Home 桩2 Home 桩(create )Home 对象3 Home 对象(建立)EJBObject 对象4 Home 对象通过容器(“服务”)建立bean5 Home 对象把EJBObject 对象桩返回给客户6 客户在EJBObject 对象桩上调用业务方法7 EJBObject 对象得到业务方法调用8 容器介入,在bean 上调用相应的业务方法有状态的会话bean 特殊时刻:bean 创建(客户需要一个bean 时)bean 使用(客户调用一个业务方法时)bean 钝化(为节省资源,以某种方式让bean “休息”) bean 激

2、活(唤醒bean ,以使bean 提供业务方法服务) bean 删除(客户用完bean 时,或超时)无状态的会话bean 特殊时刻:bean 创建(容器需要创建一个bean 时)bean 使用(客户调用一个业务方法时)bean 删除(容器认为池里面的bean 太多时)容器回调:出现一个特殊时刻,bean 不知道,容器调用了bean 的一个容器回调方法时它才知道。容器回调出自两个接口中的方法。XHome create( /home接口SessionBean /SessionBean接口 setSessionContext(SessionContext scejbActivate( ejbPass

3、ivate( ejbRomove( XBeanejbCreate( setSessionContext(SessionContext scejbActivate( ejbPassivate( ejbRomove( /组件接口中的业务方法,不是容器回调函数 实现容器回调函数 可以为空代码 一般需要保留context ,典型方法如下: public class XBean implements SessionBean private SessionContext context; /实例变量 private String name /其它实例变量public setSessionContext(S

4、essionContext ctx context = ctx;public void ejbCreate(String aName name = aName;/ 业务方法,不能以ejb 开头 如上所示,一般需要实现若干create 方法.容器回调发生时刻:bean 的状态划分:“不存在”:不具备真正bean 所需要的性质 “就绪”:正在执行或等待执行一个业务方法 “钝化”:临时保存在辅存中,以节省资源(下面编号不代表顺序)1 “不存在”>“就绪”依次调用构造函数、setSessionContext 、ejbCreate2 “就绪”>“不存在”ejbRemove 或超时3 “就绪”

5、>“钝化”ejbActivate4 “钝化”>“就绪”ejbPassivate5 “钝化”>“不存在”超时6 >“不存在”bean 抛出系统异常(非受查、未捕获)备注:bean 从一个对象变成bean 时发生的事情在调用构造函数之前,可理解为:bean 连一般的对象都不是,而执行完构造函数之后,至少已经是一个对象了。SessionContext 是bean 到容器的唯一生命线,利用它,bean 等得到很多信息,包括:bean 的home 的引用、EJBObject 对象的引用、有关客户的安全信息、要求一个事务回滚、确定事务是否回滚、得到一个事务引用,并在上面调用方法。每

6、个bean 都有它自己特有的JNDI 上下文,通过它,bean 可以找到很多东西,包括:资源管理连接工厂的引用、其它bean 的引用、一些部署时的常量值、一个表示JMS 目标的“受管对象”资源。可以访问其它bean 和资源(如:数据库)。 在业务方法中可以通过上下文访问相关信息。有状态会话bean 创建过程:1 客户在home 桩上调用create2 容器建立EJBObject 对象和SessionContext 对象3 容器构造bean 实例(构造函数,Java 对象)4 容器把bean 实例、SessionContext 对象、EJBObjectdu 对象连接起来,此过程通过在bean 实

7、例上调用setSessionContext 和ejbCreate 。一旦调用完毕,bean 实例便称为真正bean ,到“就绪”状态.备注:编写与创建相关的三个函数构造函数建议为空,可使用自动生成的;用实例变量保存上下文;所有初始化代码放在ejbCreate 中,其返回值类型为void ,而对应在home 接口中create 的返回类型是组件接口类型。bean 钝化和激活客户一段时间没调用任何方法,容器在bean 上调用ejbPassivate ,并把bean 保存在辅存中;若客户调用一个业务方法,从辅存中调入bean ,并调用ejbActivate 激活它,从而可以在它上面调用业务方法。 e

8、jbPassivate 完成时,每个非临时实例变量都必须是如下某一种的引用: 一个Serializable 对象 一个null 值 bean 远程组件接口或远程home 接口 bean 本地组件接口或本地home 接口 一个SessionContext 对象(不关系是否可序列化) UserTransaciton 接口多数情况下,不需要编写ejbPassivate 的代码,但若存在不满足要求的情况,必须编写。例如JDBC 连接不满足,若有这样的变量,则需要把它置值为null ,并在ejbActivate 中为它置值。消亡bean 时,正常情况会调用ejbRemove ,但非正常情况下,调用不到,

9、设计时需要考虑。无状态会话bean 的特殊时刻:bean 创建(容器想创建)bean 使用(客户调用业务方法)bean 删除(容器想删除或有系统异常)无“钝化”状态客户调用home 的create 方法的过程:1 客户在home 桩上调用创建方法2 容器建立EJBObject 对象3 容器把EJBObject 对象的桩发送给客户无状态会话bean 的创建与客户无关:1 容器构造SessionContext 对象和bean 实例,然后在这个bean 实例上调用setSeeionContext.2 容器把这个已经与其上下文连接的bean 放入这种类型的bean 池中。客户调用业务方法的过程:1 客

10、户在得到的EJBObject 对象桩上调用一个业务方法2 容器从池中得到一个bean ,让它与EJBObject 对象连接3 容器在bean 上调用业务方法4 容器把bean 送回池中(该bean 与EJBObject 对象终止连接)注:用户调用一个方法前,EJBObject 对象不绑定bean(有/无状态)会话bean 相关的SessionContext 中方法 EJBContext 接口中方法: getEJBHome getEJBLocalHome /这两个得到home 引用 getCallerPrincipla isCallerInRole(String s /得到有关客户的安全信息 s

11、etRollbackOnly(boolean b /要求一个事务回滚 getRollBackOnly /确定一个事务是否回滚 getUserTransaction /得到一个事务引用后三个与事务相关函数中,前两个仅供CMT ,后一个仅供BMTSessionContext 接口中扩展的两个方法: getEJBObject getEJBLocalObject /这两个得到EJBObject 对象引用实体bean是以一种OO 方式来看待持久存储库中的数据。实体是可以唯一标识的事物,实体bean 的本质是成为真实、持久实体的一个OO 视图。客户希望以OO 做的事情:建立一个新实体(SQL INSERT

12、)删除一个实体(SQL DELETE)更新一个实体状态(SQL UPDATE)对实体的查找或查询(SQL SELECT)客户得到一个已经存在的实体的引用过程:1 得到home 桩后,调用findByPrimaryKey(参数2 该方法调用传递给home 对象3 容器请求池中的一个bean 来验证数据库中是否存在相应数据(实体)4 若存在,容器建立或查找一个EJBObject 对象5 容器把EJBObject 对象的一个桩返回给客户客户创建一个新实体的过程:1 得到home 桩后,调用create(参数2 该方法调用传递给home 对象3 容器从池中选出一个bean (它已经有上下文)4 容器或

13、bean 在数据库中插入一个新行,bean 生成一个新的主键5 bean 连接到一个EJBObject 对象,上下文对象、EJBObject 对象都得到新的主键6 容器返回EJBObject 对象的一个桩。远程home 接口规则:3 声明(可选)一个或多个create 方法(必须以create 开头),返回类型必须为远程组件接口,并声明RemoteException 和CreateException 异常.4 声明findByPrimaryKey 方法,必须返回远程组件接口,并声明RemoteException 和FinderException 异常6 声明一个或多个 参数和返回类型必须是RM

14、I-IIOP 兼容 可以有重载方法 每个方法必须声明RemoteException 异常 可声明自己的非运行时异常,编译器检查的 方法名任意,但不能以create 、find 、remove 开头附:实体bean 远程home 接口的特点:1 一般需要查找一个现有的实体而不是创建一个新的实体,create 方法是可选的,必须至少提供一个查找(finder )方法,即:至少有findByPrimaryKey(String primaryKey,除此之外,开可有多个finder 方法。创建、查找方法返回的是组件业务接口,对于create 和findByPrimaryKey 客户得到一个EJBOjb

15、ect 对象(桩)的引用。2 可以完成涉及多个实体的查询。对于多个实体查找方法,客户可以得到一组EJBObject 对象(桩)引用,每个引用分别对应查询匹配的各个bean.(问题:若查询的结果很多,得到很多桩并利用它们进行远程方法调用,效率能好么?)3 解决上面问题的途径是:home 中可以提供home 业务方法,这种方法可以返回不是EJBObject 对象引用的任何类型,二不是实体本身。home 业务方法对批量操作很适合。附:会话bean 的create 与实体bean 的create1 有状态会话bean 的 create客户调用后可得到一个新的有状态会话bean (专用于该客户)的EJB

16、Object 对象的引用;可以(通常)有参数,bean 利用这些参数完成特定于客户的初始化;客户调用后,容器会建立一个新的会话bean 。2 无状态会话bean 的 create客户调用后可得到一个bean 的EJBObject 对象的引用;无参数,不做任何特定于客户的初始化。(容器调用bean 的ejbCreate 时,这个bean 不与任何客户关联)客户调用时,容器不建立新的会话bean ,而且不会从池中取出任何bean ,直到客户调用业务方法时,才会真正从池中取出一个bean 。3 实体bean 的 create客户调用后,在数据库中插入新行,对客户来说,得到一个(新的)EJBObjec

17、t 对象的引用; 一般是有参数的,虽然允许无参数,但无参数的很难有意义;容器不会建立一个新的实体bean ,而是从池中取出一个并运行ejbCreate 方法,该方法取create 方法的参数,并在数据库中建立一个新实体。客户删除实体的过程:1 客户在EJBObject 对象桩上调用remove2 该调用传递给EJBObject 对象3 容器在bean 上调用ejbRemove4 容器或bean 删除数据库中的实体5 bean 不在表示该实体了,容器把它送入池中。附:会话bean 与实体bean 的remove 比较:1 有状态会话bean 的 remove客户调用它告诉容器已经用完这个bean

18、 ;容器调用bean 得到ejbRemove (除非bean 已经钝化),并杀死这个bean ;删除这个bean 后,若客户试图再使用EJBObject 对象引用,会得到一个异常。2 无状态会话bean 的 remove客户调用它告诉容器已经用完这个bean ;容器不做什么事情,因为此时,bean 已经回到池中。(响应一个业务方法后就回到池中了)客户“删除”了这个bean 后,若再使用EJBObject 对象引用,会得到一个异常。3 实体bean 的 remove客户调用它通知容器删除带这个主键的实体; 容器调用bean 的ejbRemove ,若bean 支持客户触发的删除,则从数据库删除该

19、实体;客户删除了这个bean 后,若再使用EJBObject 对象引用,会得到一个异常;任何客户都不能使用该实体的EJBObject 对象引用了。实体bean 与底层实体的同步(客户调用过程):1 客户调用一个业务方法2 容器截获该调用,并在得到bean 之前开始一个事务3 容器请求数据库为相关一行加锁4 容器用数据库中的实体状态加载bean ,现在除了这个bean 外谁也不能修改数据库中的实体数据5 bean 在同一个事务中运行多个方法6 容器事务结束前,若有改变bean 数据值的操作,则用bean 的新状态对数据库进行更新7 容器告诉数据库为相关行解锁同步工作的完成种类:Container

20、-Managed Persistence(CMP )Bean-Managed Persistence(BMP )1 客户通过以下三种途径之一得到EJBObject 对象引用(具有某主键值),在其上调用某方法, 如:getAddress. customerHome.findByPrimaryKey(“28” customerHome.create(“zhao ”, ”ming ”, ”28”, ”Chan g chun” custmoerHome.getCustomerByCity(“Beijing ”2 该调用传递给EJBObject 对象3 EJBObject 对象得到调用时,并没有对应的实

21、体bean ,即:它并没与“扮演”对应主键值实体的bean 连接起来。4 容器从池中选出一个bean ,调用ejbActivate 将它激活5 容器在数据库中利用主键得到实体数据,并利用数据对选出的bean 进行数据加载6 容器调用bean 的ejbLoad ,告诉它已经加载好,(bean 在ejbLoad 代码中可完成其它数据的初始化)。7 容器把该bean 与EJBObject 对象连接在一起EntityBean 接口中的方法 setEntityContext(EntityContext ec ejbPassivate /事务结束后返回池中时调用 ejbActivate/从池中出来时调用

22、ejbRemove/客户调用 remove 时调用 unsetEntityContext / 容器想缩小池大小时调用 ejbLoad /容器利用底层数据库刷新 bean 状态时 ejbStore/ 容器利用 bean 状态更新数据库时 后三个是比会话 bean 多的 实体 bean 的 bean 类除了具有上面的回调方法、组 件接口中的业务方法外,还需要有 home 接口相关的 回调方法。 对应 home 接口中的每一个 create 方法,必须有两 个方法:ejbCreate,ejbPostCreate;home 接口中的每 个 home 业务方法,有一个匹配的 ejbHome<方法名

23、> 例如: home 接口定义如下: CustomerHome create(String last, String first, String addr fineByPrimaryKey(String key findByCity(String city updateAll(String cmd 则 CustomerBean 中的方法有: ejbCreate(String last, String first, String addr ejbPostCreate(String last, String first, String addr ejbFindByPrimaryKey(String key ejbFindByCity(String city ejbHomeUpdateAll(String cmd 编写实体 bean 类时需要完成的事情: 1 home 接口中的方法:home 接口中每个 create 方法 有 ejbCreate 和 ejbPostCreate;home 接口中每个业 务方法,有一个 ejbHome<方法名>方法;对于容器 托管的 bean(CMP)不用编写查找方法,容器会根 据部署描述文件中的信息自动完成。 2 组件业务接口中的方法。 3 EntityBean 接口中的方法。 4 虚持久字段。每个持久字段,需要提供一个抽象获 取方法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论