持久化實體Bean的兩種方式:
既然需要將實體Bean映射到存儲源中,應用肯定需要提供操作RDBMS的代碼。
Bean管理持久化實體Bean,是手工完成持久化行為的EJB類型。換句話所,組件開發(fā)者必須開發(fā)代碼,以將內(nèi)存中的持久化域存儲到底層存儲源中。這種方式成為BMP。
EJB規(guī)范還提供了BMP的替代組件類型:借助于EJB容器完成數(shù)據(jù)的持久化。這就是容器管理持久化(CMP)。此時,通常都要將持久化邏輯從CMP中剝離出來。然后借助于容器提供的工具完成數(shù)據(jù)的自動持久化。最后,EJB容器將生成訪問數(shù)據(jù)庫的代碼。注意,CMP是獨立于任何O/RMapping技術的數(shù)據(jù)對象,因此可以在各種企業(yè)環(huán)境中重用CMP組件。
CMP極大減少了實體Bean的代碼量,因為不用直接編寫JDBC代碼了。EJB容器將會處理所有的持久化操作,這是EJB勢能應用的優(yōu)勢之一。
在執(zhí)行ejbCreate()方法期間,即在初始化內(nèi)存中的實體Bean時,將會在底層RDBMS中插入新的記錄,并將這些記錄同實體Bean實例建立起映射關系。當調(diào)用BMP實體Bean的ejbCreate()時,它將負責生成RDBMS中的數(shù)據(jù)。類似的,當調(diào)用BMP實體Bean的ejbRemo()時,它將負責RDBMS中數(shù)據(jù)的刪除。
在EJB領域中,客戶并沒有直接調(diào)用EJB實例,它們僅僅調(diào)用了EJB對象代理。借助于Home對象能夠生成EJB對象。因此,對于定義在EJB Bean類中的各個ejbCreate()方法,在Home接口中也將存在對象的create()方法。當客戶調(diào)用Home對象的create()方法時,容器將把調(diào)用請求委派給ejbCreate()方法。
開發(fā)者可以通過多種方式查找實體Bean.需要在實體Bean的Home接口中列舉出這些查找方法。我們稱這些方法為"finder"方法。除了暴露創(chuàng)建、銷毀實體Bean實例的方法外,Home接口還需暴露finder方法。這是實體Bean的Home接口同其他EJB類型中的Home接口的最明顯區(qū)別。
實體上下文,所有的EJB組件都存在上下文對象供組件訪問到容器環(huán)境使用。這些上下文對象含有EJB容器設置的環(huán)境信息。因此EJB組件能夠訪問到上下文,從而獲取各種信息,比如事務,安全性信息。對于實體Bean而言,存在javax.ejb.EntityContext上下文接口。它繼承自EJBContext
public interface javax.ejb.EntityContext extends javax.ejb.EJBContext{
public javax.ejb.EJBLocalObject getEJBLocalObject();
public javax.ejb.EJBObject getEJBObject();
public java.lang.Object getPrimarykey();
}
通過調(diào)用getEJBObject()方法,當前客戶能夠獲得某實體Bean實例對應的EJB對象。客戶調(diào)用的是EJB對象,而不是實體Bean實例本身。因此,客戶能夠在應用中引用返回的EJB對象。
實體Bean實例對應的主鍵可以通過getPrimaryKey()方法獲得。主鍵唯一標識某實體Bean實例。當實體Bean實例存儲到存儲源中時,可以使用主鍵獲得單個實體Bean實例。由于在RDBMS中也存在主鍵,因此主鍵能夠唯一標識某個實體Bean實例。