每一個Home接口都擴展了javax.ejb.EJBHome接口。如下代碼顯示了javax.ejb.EJBHome接口的定義:
package javax.ejb;
public interface EJBHome extends java.rmi.Remote() {
void remove(Handle handle) throws java.rmi.RemoteException,RemoveException;
void remove(Object primarykey) throws java.rmi.RemoteException,RemoveException;
EJBMetaData getEJBMetaData() throws RemoteException;
Homehandle getHomeHandle() throws RemoteException;
}
這里提供了兩個remove()方法來刪除Enterprise bean的實例。第一個remove方法是通過句柄來刪除一個Enterprise bean的實例。第二個remove方法通過主鍵來刪除一個Enterprise bean的實例。
在眾多的Enterprise bean實例中,句柄唯一的標識一個實例。一個句柄與它引用的Enterprise bean有相同的生命期。考慮一個實體對象,客戶可以通過一個句柄來重新獲得相應的Enterprise bean的實例。一個句柄能夠?qū)粋€Enterprise bean對象的多個實例。例如,即使當Enterprise bean對象所在的主機崩潰了,或者Enterprise bean對象在不同的機器之間移動,句柄仍是有效的。這里的句柄是Serialized句柄,與CORBA中的字符串化的CORBA對象的引用是相似的概念。
在EJBHome接口中的第二個remove操作通過其主鍵來決定要刪除的Enterprise bean。主鍵可以是擴展了Java Object類的任何類型,但是,必須要實現(xiàn)Java的Serializable接口。主鍵是標識實體bean的主要的方法。通常,主鍵是數(shù)據(jù)庫中的一個關(guān)鍵字,唯一的定義了由實體bean代表的數(shù)據(jù)。
方法getEJBMetaData()返回了Enterprise bean對象的metadata接口。這個接口允許客戶獲得Enterprise bean的metadata信息。當開發(fā)工具來編譯鏈接應用程序的時候,或者配置工具來配置的時候,可能會用到metadata信息。Javax.ejb.EJBMetadata接口提供了獲得javax.ejb.EJBHome接口,home類,remote接口,還有獲得主鍵的方法。也提供了一個isSesson()的方法來確定在放這個home接口的對象是會話bean還是實體bean。IsStatelessSession()方法指示這個會話bean是有狀態(tài)還是無狀態(tài)的。如下代碼顯示了javax.ejb.EJBMetadata接口的定義部分的代碼。
Public javax.ejb;
lic interface EJBMetaData{
EJBHome getEJBHome();
Class getHomeInterfaceClass();
Class getRemoteInterfaceClasss();
Class getPrimaryKeyClass();
Boolean isSession();
Boolean isStatelesssSession();
}
會話bean的home接口:
在前面我們說過,一個會話bean只有一個客戶。這就是說,當一個客戶創(chuàng)建一個會話bean的時候,這個會話bean的實例只是為了這個創(chuàng)建它的客戶而存在(這里,我們指的是有狀態(tài)的會話bean。無狀態(tài)的會話bean因為并不保持會話的狀態(tài),所以可以多個客戶)。
因為home 接口包括了一個或多個的Create()方法的定義,成為會話bean的工廠。對每一個Create()方法,EJB規(guī)范定義了如下的命名約定:
如下代碼顯示了一個會話bean對象的不同的Create()方法,其中必須的部分用粗體顯示:
public interface AtmHome extends javax.ejb.EJBHome{
Atm create() throws java.rmi.RemoteException,javax.ejb.CreateException;
Atm create(Profile preferredProfile)
Throws java.rmi.RemoteExeption,javax.ejb.CreateException;
}
注意,會話Bean的home 接口并沒有定義finder方法來定位對象。因為一個有狀態(tài)的會話bean只是給創(chuàng)建它的客戶使用。如果不是客戶自己創(chuàng)建的會話Bean,沒有必要也不允許去定位這樣的一個會話Bean。
實體bean的home接口:
跟會話bean的home接口一樣,實體bean的home接口提供了Create()的方法。另外,實體
bean的Home接口還提供了finder方法,這樣,客戶就能夠定位并使用實體bean的對象。Finder操作是必要的,因為實體bean是長時間存活的,可以被多個客戶所使用。對于大多數(shù)的應用程序而言,實體bean的實例是存在的,客戶只需要找到一個用來使用就可以了。
一個Entity bean的home接口必須提供一個缺省的finder方法:finderByPrimary(primaryKey)。這個方法允許客戶通過主鍵來定位Entity bean。方法只有一個唯一的參數(shù):主鍵。方法的返回值類型是實體bean的remote接口類型。主鍵的類型可以是擴展了Java Object類型的任何Java類型。在配置描述器中,你必須告訴容器主鍵的類型。注意,根據(jù)定義,findByPrimaryKey()方法總是返回一個單個的Entity 對象。而其它的finder()方法可以返回Entity對象的集合。
下面是findByPrimaryKey()方法的定義:
$#@60;entity bean’s remote interface$#@62; findByPrimaryKey($#@60;primary key type$#@62; key)
throws java.rmi.RemoteException,FinderException;
home接口還可以定義別的finder()方法。每一個finder()方法都必須在Enterprise bean類里面有一個對應的實現(xiàn)。每一個finder方法都必須符合如下的約定。
另外,Entity的Home接口能夠提供一個或多個的Create()方法。這些方法返回了實體bean的remote接口的對象引用類型。它們的參數(shù)必須由應用程序指定。
Home接口中的Create()方法必須遵守如下規(guī)則:
如下代碼顯示了不同類型的finder()和Create()方法。必須的部分用粗體表示:
public interface AccountHome extends javax.ejb.EJBHome{
Account create(String accoundId)
throws java.rmi.RemoteException,javax.ejb.CreateException;
Account create(String accoundId, float initialBalance)
Throws java.rmi.RemoteException, javax.ejb.CreateException;
Account findByPrimaryKey(String key)
Throws java.rmi.RemoteException, javax.ejb.FinderException;
Enumeration findBySocialSecurityNumber(String socialSecurityNumber)
Throws java.rmi.RemoteException,javax.ejb.FinderException;
}
Enterprise bean實現(xiàn):
Enterprise bean的實現(xiàn)包括了所有的應用程序指定的語義。這是Bean提供者的主要工作。一個會話bean類實現(xiàn)了javax.ejb.SessionBean接口。而一個實體bean實現(xiàn)了一個javax.ejb.EntityBean接口。這兩個接口都擴展了同一個基類javax.ejb.EnterpriseBean。但是會話bean的實現(xiàn)和實體bean的實現(xiàn)不同。
Enterprise bean接口:
Enterprise bean接口javax.ejb.EntpriseBean定義了一個通用的基類,并擴展了java.io.Serializable接口。它并沒有定義任何方法。其定義代碼如下:
Package javax.ejb;
Public interface EnterpriseBean extends java.io.Serializable{}
Handle句柄:
Handle是遠程對象引用Enterprise bean對象它的Home接口的一種抽象的方式。所有的Enterprise bean對象句柄都實現(xiàn)了javax.ejb.Handle接口。這個接口提供了對Enterprise bean對象的持久的引用。其定義代碼如下:
Public interface javax.ejb.Handle extends java.io.Serializable{
Public EJBObject getEJBObject() throws java.rmi.RemoteException;
}
通過Serialize類(這個類實現(xiàn)了handle接口)的實例,handle可以持久的存儲一個Enterprise bean對象的引用。這與CORBA IOR的字符串化相似。Javax.ejb.Handle擴展了java.io.Serializable接口。
Javax.ejb.HomeHandle接口也提供了Enterprise bean的home接口的持久的引用。Javax.ejb.HomeHandle由所有的Home對象handle實現(xiàn)。其定義代碼如下:
Public interface HomeHandle extends java.io.Serializable{
Public EJBHome getEJBHome() throws RemoteException;
}
通常,Handle是由容器實現(xiàn)的。
五、編程限制:
下面列舉了一些EJB1.1規(guī)范的編程限制:
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答?。?點擊進入論壇