- 会话 bean
客户共享 Home ,但是不会共享 bean
每个客户都要得到自己的 EJBObject 引用和 bean
- 实体 bean
客户共享 Home ,而且可能共享 bean
如果两个客户想要访问同一个 Customer ( Fred Smith #420 ),那么这两个客户都会有同一个 EJBObject 的引用。
- 创建有状态会话 bean
得到 Home 桩后,客户在 Home 上调用 create (创建方法), Home 则创建 bean ,而且会为 bean 创建 EJBObject ,并返回 EJBObject 桩
- 创建无状态会话 bean
得到一个 Home 桩后,客户在 Home 上调用 create , Home 为客户提供一个现有 EJBObject 的桩,但是没有为这个 EJBObject 关联 bean , bean 一直待在池中,知道客户使用 EJBObject 桩真正调用一个业务方法时, bean 才会出来
- 消息驱动 bean
消息驱动 bean 没有客户视图。消息驱动 bean 没有向客户展现方法的接口。换句话说,消息驱动 bean 没有 Home 或者 EJBObject ,它们没有 Home 接口或组件接口
客户视图
客户想要的是 bean 的一个引用。但是,客户最多只能得到 bean 的组件接口( EJB 对象)的一个引用。
如果客户想要一个 EJB 对象引用,客户必须得到 bean home 接口的一个引用
客户要在 bean 的 home 上完成一个查找。
客户如何使用会话 bean :创建、使用和删除
1. 创建:客户想 home 接口请求 bean 组件接口的一个引用(客户在 home 桩上调用一个 create 方法)
2. 使用:客户调用组件接口中声明的业务方法
3. 删除:客户调用 bean 的 EJB 对象桩上的 remove
得到 home 接口桩
1. 得到一个 InitialContext
2. 使用 InitialContext 得到 bean 的 home
3. 把查找的结果指定给 home 接口引用
窄化会强制 JNDI 查找返回的对象肯定是 home 接口。
Home 接口规则
1. 导入 javax.ejb.* 和 java.rmi.RemoteException
2. 扩展 EJBHome
3. 声明一个 create ()方法,这个方法要返回组件接口
a) 对于无状态会话 bean ,只能有一个 create ,而且它必须没有任何参数
b) 有状态会话 bean 可以有多个重载的 create 方法,而且不一定非要有一个无参数的 create
c) 有状态 bean 中创建方法的名字必须以 create 开头
EJBHome 中的方法
EJBMetaData getEJBMetaData ():从 bean 得到反射之类的信息
HomeHandle getHomeHandle ():对 home 串行化,这样以后就能再次使用这个 home ,而无需通过 JNDI
Void remove ( Handle h ):告诉 home ,已经用完了一个会话 bean
Void remove ( Object key ):告诉 home 删除一个实体 bean
组件接口的规则
1. 导入 javax.ejb.* 和 java.rmi.RemoteException
2. 扩展 EJBObject
3. 声明一个或多个业务方法啊,这些方法都要抛出一个 RemoteException 异常
a) 参数和返回类型必须是 RMI-IIOP 兼容(即可序列化)
b) 可以有重载方法
c) 每个方法都必须声明一个 RemoteException 异常
d) 可以声明自己的应用异常,但是这些异常不能是运行时异常
EJBObject 中的方法
Object getPrimaryKey() :得到实体 bean 的主键
EJBHome getEJBHome() :得到 bean 的 home
Handle getHandle() :保存 EJBObject 的一个引用
Void remove() :已经用完 bean
Boolean isIdentical(EJBObject o) :比较两个 EJB 对象,查看它们是否引用同一个 bean
Handle getHandle() :
句柄是一个可串行化对象,它知道怎么拿回原来的远程 EJB 对象。句柄本身不是一个桩,但它能得到桩。句柄只有一个方法,就是 getEJBObject() 。这个方法会返回一个类型为 EJBObject 的对象。所以必须对得到的桩进行类型强制转换和窄化。
Boolean isIdentical(EJBObject o)
- 无状态会话 bean
如果两个引用来自同一个 home ,即使这两个桩引用了两个不同的远程 EJB 对象, isIdentical 也返回 true
- 有状态会话 bean
只要是两个不同的桩,这个方法肯定返回 false
- 实体 bean
如果两个桩引用了有相同主键的两个实体,这个方法就返 true
在 home 上调用删除方法不是要删除这个 home
在 home 上调用删除方法只是告诉 home 删除一个 bean 。也就是从这个 home 生成的 bean
在调用一个 home 删除方法时,必须唯一的标识你要删除的那个 bean 。对于实体 bean ,要用主键或者一个句柄来标识 bean ,对于会话 bean ,则必须使用句柄。句柄只适用于远程 home 客户。
远程客户视图 | 本地客户视图 | |||
EJBHome |
|
| ||
EJBObject | Object getPrimaryKey() EJBHome getEJBHome() Handle getHandle() Void remove() Boolean isIdentical(EJBObject o) |
|