EJB的home接口

本文介绍了EJB的Home接口,包括如何通过lookup获取Home接口,以及Home接口中的一些核心方法,如create方法用于创建EJB对象,remove方法用于移除会话或实体bean,getPrimaryKey方法用于获取实体bean的主键等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EJB涉及两个接口,Home接口(扩展自EJBHome)和组件业务接口(扩展自EJBObject),这两个接口都是远程接口,但还有两个对应的本地接口EJBLocalHome和EJBLocalObject接口。 

客户有一个目标,就是在bean上调用一个业务方法!! 
客户想得到的是bean的一个引用,但是最多只能得到bean的组件接口的一个引用(即EJB对象)的一个引用。如果想得到一个EJB对象引用,客户必须得到bean home接口的一个引用。 

首先必须得到一个home接口的引用,换句话说,必须得到home对象的桩。。。我们要用它来调用create(),这是你必须在home接口中定义的一个方法,用于返回一个组件业务接口的对象,这才能得到我们真正想要的东西----EJB对象桩。 

想要得到一个home接口的引用,需要通过JNDI。JNDI(Java name and directory interface)java命名和目录接口。是一个用于访问命名与目录服务的API。 

Context ct = new InitialContext(); //InitialContext是Context的一个子类型,是你访问JNDI树的入口点。这其实是你的第一个上下文,就像访问文件的最前面的一级目录。
 
Java代码   收藏代码
  1. Object o = ct.lookup("Advisor"); //查找  
  2. AdviceHome home = (AdviceHome) PortableRemoteObject.narrow(o,AdviceHome.class); //强制类型转换  
  3. Advice advisor = home.create();  //得到组件接口,相当于得到EJB对象的桩  

我怎么知道是哪个开发人员给bean起的名字呢?  
bean的开发人员(即bean的提供者)只负责编写这个bean,让它作为一个可重用组件,这个bean在哪使用如何使用,他一无所知。部署人员会用一个逻辑名来注册bean。  
为甚不能直接AdviceHome home = (AdviceHome )o,这样强制类型转换呢?  
对于一个远程home接口,强制类型转换还不够。 
窄化(narrowing)会强制JNDI查找返回的对象肯定实现Home接口。这样才能进行强制类型转换。
 

为会话bean编写远程Home接口  
你自己编写的Home接口,必须扩展自EJBHome,并且声明一个create()方法,这个方法返回组件接口,必须声明一个RemoteException和CreateException异常。还可以声明其他的受检查异常。 
注意:对于无状态会话bean,只能有一个create()方法,而且不能有参数。 
有状态bean,可以重载create()方法,而且并不一定需要有一个无参数的create()方法。 
有状态bean中的创建方法,必须以create开头。其参数要求是serializable对象,基本类型,远程对象或其组合。 
注意:任何实现了AdviceHome的对象,不仅仅实现了其定义的create方法,还有实现EJBHome中的方法,该对象是由容器创建的。
EJBHome中的方法有: 
 
Java代码   收藏代码
  1. public abstract void remove(javax.ejb.Handle arg0) throws java.rmi.RemoteException, javax.ejb.RemoveException; //告诉home,你已经用完了一个会话bean。也可以用于实体bean,但不便  
  2.    
  3.   public abstract void remove(java.lang.Object arg0) throws java.rmi.RemoteException, javax.ejb.RemoveException; //告诉home,删除一个实体bean,即永久从数据库中除去记录,只能用于实体bean。  
  4.     
  5.   public abstract javax.ejb.EJBMetaData getEJBMetaData() throws java.rmi.RemoteException; //客户一般不会调用  
  6.     
  7.   public abstract javax.ejb.HomeHandle getHomeHandle() throws java.rmi.RemoteException;  

不管什么类型的bean,都只有一个home接口,即EJBHome接口,没有EJBSessionHome或EJBEntityHome  
组件接口 
注意:必须扩展EJBObject接口,声明一个或多个业务方法,这些方法必须抛出java.rmi.RemoteException异常。可以有重载方法。 
EJBObject接口中一共有5个方法,所有实现了组件接口的对象,必须实现业务方法和这五个方法。
Java代码   收藏代码
  1. public abstract javax.ejb.EJBHome getEJBHome() throws java.rmi.RemoteException;//    得到bean的home,在建立多个bean时会高效。  
  2. public abstract java.lang.Object getPrimaryKey() throws java.rmi.RemoteException; // 得到实体bean的主键,不能用于会话bean。因为会话bean没有一个唯一身份要展现给客户。  
  3. public abstract void remove() throws java.rmi.RemoteException, javax.ejb.RemoveException;  
  4.  // 告诉bean,已经用完了,这样容器可以释放这个bean为你保留的资源。这里只针对会话bean。  
  5. public abstract javax.ejb.Handle getHandle() throws java.rmi.RemoteException; // 保存EJBObject的一个引用  
  6. public abstract boolean isIdentical(javax.ejb.EJBObject arg0) throws java.rmi.RemoteException;// 比较两个EJB对象,查看它们是否引用同一个bean  


获取home的流程如下面的图形所示: 













Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax.ejb.AfterCompletion.class javax.ejb.ApplicationException.class javax.ejb.Asynchronous.class javax.ejb.AsyncResult.class javax.ejb.BeforeCompletion.class javax.ejb.ConcurrencyManagement.class javax.ejb.ConcurrencyManagementType.class javax.ejb.ConcurrentAccessException.class javax.ejb.ConcurrentAccessTimeoutException.class javax.ejb.CreateException.class javax.ejb.DependsOn.class javax.ejb.DuplicateKeyException.class javax.ejb.EJB.class javax.ejb.EJBAccessException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb.EJBLocalHome.class javax.ejb.EJBLocalObject.class javax.ejb.EJBMetaData.class javax.ejb.EJBObject.class javax.ejb.EJBs.class javax.ejb.EJBTransactionRequiredException.class javax.ejb.EJBTransactionRolledbackException.class javax.ejb.embeddable.EJBContainer.class javax.ejb.EnterpriseBean.class javax.ejb.EntityBean.class javax.ejb.EntityContext.class javax.ejb.FinderException.class javax.ejb.Handle.class javax.ejb.HomeHandle.class javax.ejb.IllegalLoopbackException.class javax.ejb.Init.class javax.ejb.Local.class javax.ejb.LocalBean.class javax.ejb.LocalHome.class javax.ejb.Lock.class javax.ejb.LockType.class javax.ejb.MessageDriven.class javax.ejb.MessageDrivenBean.class javax.ejb.MessageDrivenContext.class javax.ejb.NoMoreTimeoutsException.class javax.ejb.NoSuchEJBException.class javax.ejb.NoSuchEntityException.class javax.ejb.NoSuchObjectLocalException.class javax.ejb.ObjectNotFoundException.class javax.ejb.PostActivate.class javax.ejb.PrePassivate.class javax.ejb.Remote.class javax.ejb.RemoteHome.class javax.ejb.Remove.class javax.ejb.RemoveException.class javax.ejb.Schedule.class javax.ejb.ScheduleExpression.class javax.ejb.Schedules.class javax.ejb.SessionBean.class javax.ejb.SessionContext.class javax.ejb.Session
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值