Entity Bean提供了一個關聯式資料庫的物件導向的抽象,它能同時從物件導向技術和面向過程技術中獲益。既然Entity Bean和Session Bean都是Enterprise Bean,那麼它們必然具備一定的相同點:Entity Bean也要有一個Home Interface、Bean Interface和Bean Class,如所示:
Session Bean調用Entity Bean的Home Interface和Bean Interface來建立、尋找和刪除Entity Bean,嚴格來講其它用戶端也可以直接調用這些介面,只是這並不是一個很好的做法。
Home Interface:
Entity Bean的Home Interface可以用來建立一個新的Entity Bean、刪除一個Entity Bean以及尋找一個已經存在的Entity Bean。調用Home Interface的create方法將會建立一個新的Entity Bean執行個體,這個方法類似於一般Java類中的構造器;當調用Home Interface的remove方法時,會刪掉指定的Entity Bean執行個體;當調用Home Interface的find方法時,會尋找合適的Entity Bean執行個體並返回它們,Entity Bean至少要有一個叫做findByPrimaryKey的find方法。同Session Bean一樣,Entity Bean的Home Interface也必須要繼承EJBHome介面。
Bean Interface:
同Session Bean相似,Entity Bean的Bean Interface也是用來暴露一個bean的方法,只不過它的方法大部分都是Entity Bean中域的set和get方法。同Session Bean一樣,Entity Bean的Bean Interface也必須要繼承EJBObject介面。
Bean Class:
Entity Bean的Bean Class必須要整合EntityBean介面,它包含了在Bean Interface中指定的setter和getter方法以及包含了商務邏輯的方法,除此之外,它還必須實現那些由EJB容器調用的聲明周期方法如ejbCreate等等。
容器管理持久化(Container-Managed Persistence,CMP):
Entity Bean都與後台一個持久化的資料存放區相關,這個資料存放區通常是關聯式資料庫,Entity Bean的一個特性就是能夠使這個持久化過程自動化,這個特徵就叫做容器管理持久化(CMP)。因此,當我們調用Home Interface的create方法時,不僅僅建立了一個新的Entity Bean,同時還在它所對應的資料庫表中新增了一行記錄,整個過程是由容器為我們管理的,包括在什麼時候插入這一行記錄;調用find方法時,會在相應的資料庫表中尋找合適的記錄,每一行記錄對應一個Entity Bean的執行個體。當使用CMP的時候,資料庫模式直接反映了Entity Bean的設計,這和Hibernate裡面非常相似,通常一個表對應一個實體。
除了CMP外,還有一個策略是BMP(Bean-Managed Persistence),這要求我們自己去管理所有的持久化過程。通常在如下情況下才需要用到BMP:
1.基於一個已經存在的資料庫構建一個EJB應用,如果Entity Bean的設計不能與已有的資料庫模式相匹配,此時需要用到BMP
2.不存在資料庫,Entity Bean用於對一個外部系統進行封裝
3.EJB伺服器不支援CMP
一個Entity Bean要求它的一個或多個域能夠唯一的識別它,這些個域就叫做主鍵,就像Hibernate中每個持久化類的ID屬性一樣,主鍵的主要作用就是用於尋找一個特定的Entity Bean,它可以是任何一個序列化的對象,如String或者Integer。Entity Bean還一個特徵就是EQL(EJB Query Language),如同Hibernate中的HQL。