Entity Bean與Session Bean的不同表現在如下幾個方面:
持久性
在應用或應用服務器的運行時間外,Entity Bean狀態數據仍存在于持久數據存儲之中。
Entity Bean有兩種持久類型:Bean管理持久類型(Bean-managed Persistence,BMP)和容器管理的持久類型(Container-managed Persistence,CMP)。對于Bean管理的持久類型,由組件模型中Enterprise Bean類的代碼控制對持久存儲中狀態數據的訪問;容器管理持久性類型的Entity Bean,則由容器生成和管理對應持久存儲中狀態數據的訪問方法。開發者可以不用編寫這些方法。
共享訪問
相對于Session Bean對應于特定的客戶端會話而言,Entity Bean可以在客戶端間被共享訪問,對于多個并發的客戶端訪問,由容器提供了完整的事務(transaction)管理機制,保證狀態數據的完整性。并且提供了通過修改部署描述,指定事務屬性的能力,無需在代碼中對事務邊界進行控制。
Primary Key
每個Entity Bean實例擁有一個唯一的標識對象,客戶端可以使用此標識定位特定的Entity Bean實例。
關系
如存在于關系型數據庫中的業務實體數據,Entity Bean之間也可以具有類似的關系。對于Bean管理持久性的Entity Bean,需要在Entity Bean的組件類中對關系進行編碼;而對于容器管理持久性的Entity Bean,則由容器對關系進行控制。因此,容器管理持久性的Entity Bean之間的關系,被稱為容器管理關系(Container-managed relationship,CMR)。
容器管理持久性(Container-managed Persistence,CMP)
容器管理持久性指由EJB容器處理Entity Bean需要的對數據庫的訪問。使Entity Bean可以脫離特定類型的數據庫,從而具有更高的靈活性。
為使Entity Bean可以由EJB容器對持久性進行管理,需要提供Entity Bean的抽象模式(abstract schema)信息。
抽象模式(Abstract Schema)
抽象模式作為容器管理持久性的Entity Bean部署描述的一部分,提供對Entity Bean持久域和關系的定義。之所以稱其為“抽象”模式,是為了與具體的底層數據存儲的物理模式區分開來。例如,在關系型數據庫中,物理模式由諸如表或列等結構構成。
對于容器管理持久性的Entity Bean,需要在部署描述中定義抽象模式的名字。這些名字將可以通過使用Enterprise JavaBeas™ Query Language(EJB™ QL)編寫的查詢語句進行引用。例如,必須為每一個finder方法定義一個EJB QL查詢語句,通過此語句定義當此finder方法被調用時,容器執行的查詢。
持久域(persistent fields)
被定義的Entity Bean的持久域保存在底層的數據存儲中,所有這些域構成整個Entity Bean的狀態。在運行時,容器自動對這些狀態與數據庫中的數據進行同步。一般,容器在部署時將Entity Bean與特定的數據庫表進行映射,將持久域與數據庫表中的列進行映射。
關系域(relationship fields)
關系域可視為數據庫表中的外鍵(foreign key),用于標識Bean之間的關系。
容器管理關系(Container-managed Relationship,CMR)
容器管理持久性的Entity Bean有以下四種容器管理關系:
one-to-one,一個Bean的單個實例關聯另一個Bean的單個實例;
one-to-many,一個Bean的單個實例關聯另一個Bean的多個實例;
many-to-one,一個Bean的多個實例關聯另一個Bean的單個實例;
many-to-many,一個Bean的多個實例關聯另一個Bean的多個實例;
容器管理關系的方向
容器管理關系的方向可以是雙向或單向。在一個雙向的關系中,涉及的Bean都有一個關系域與另外的Bean關聯,通過關系域,可以從一個Bean的實例中訪問關聯的Bean對象,反之亦可。在一個單向的關系中,只有一個Bean擁有關聯其他Bean的關系域,只能從這個Bean的實例訪問被關聯的Bean對象,而不可從被關聯的Bean對象訪問到這個實例。
EJB QL查詢可以通過關系進行定位。關系的方向決定了是否可以從一個Bean定位另一個Bean。如訂單作為一個Bean,訂單中的項目作為一個Bean,二者擁有雙向關系,即訂單知道擁有哪些項目,而項目知道自己屬于某個訂單,因此,通過關系,可以從訂單定位訂單中的項目,也可以從訂單中的項目定位到訂單;
Entity Bean的特征
持久性
由于Entity Bean的狀態數據保持在持久存儲中,因此,即使容器或服務器失效,Entity Bean的狀態數據仍然存在。
持久業務數據的對象表示
Entity Bean是持久業務數據的對象表示,更改Entity Bean的實例的狀態,數據庫中的對應信息也將自動更新。實例狀態是數據庫數據的視圖,而不是兩個分離的數據。
表示相同的底層數據的多個Entity Bean實例
在企業應用中,通常出現多個客戶對某些業務實體的并發訪問,一般,EJB容器通過維護同一個EJB實例的多個拷貝,提供給不同的客戶,以此提高對客戶請求的響應速度,EJB容器提供保持實例狀態的一致性的機制。而這種特性對于客戶來說是透明的,因此,客戶可以認為操作中的EJB實例是唯一的實例,可以不用考慮EJB實例狀態在多個并發客戶間的一致性。
可查找的Entity Bean
因為Entity Bean實例擁有其獨有的標識,因此,除了可以創建Entity Bean實例外,如使用SQL中的SELECT語句,還可對在數據庫中已有的業務數據進行查找。對Entity Bean實例的查找一般通過在Entity Bean的Home接口中定義finder方法實現
數據的對象視圖
多層企業應用中,通常有邏輯層和數據層之分,邏輯層中的邏輯組件用于表示特定的業務邏輯或滿足特定的業務需求,邏輯組件中一般只封裝邏輯,而業務數據則通過數據層中的數據組件提供表示。
業務數據通常以數據庫表的方式保存在關系型數據庫中,在EJB編程模型成為企業應用開發的標準之前,開發者一般通過JDBC或其他數據庫訪問機制,將數據映射成為內存中的業務對象,并提供保證這兩個數據拷貝之間的一致性的方法,即業務對象知道如何從數據庫中獲得自身的狀態,當自身狀態改變時,同步數據庫中的對應數據,對于關系型數據,往往需要更復雜的控制。
這樣,數據層中的數據組件往往顯得非常臃腫,代碼中充斥大量的底層服務處理,不能提供業務實體清晰的面向對象表示,即由緊湊的狀態和方法構成的對象,而且給開發和維護帶來極大的不便。
通過Entity Bean組件模型,開發者可以快速地建立起緊湊、靈活而且具有分布式特性的業務數據的對象視圖,通過類似于標準的Java語言中創建、清除對象實例、調用實例的方法,對組件進行操作,組件中只需提供應用的業務邏輯。
組件結構
Entity Bean由以下幾部分構成:
· Home接口,客戶端通過此接口對Entity Bean對象進行創建、清除、查找等操作;
· 組件接口,客戶端通過此接口訪問Entity Bean對象,訪問對象狀態及執行對象業務方法;
· 組件類,開發人員在此類中提供對以上兩個接口中定義的方法的實現;
· 部署描述,提供Entity Bean的事務屬性、安全等配置信息。
Primary Key
與關系型數據庫中的數據類似,每個Entity Bean實例也具有一個標識數據的唯一性的Primary Key對象,Primary Key對象可以具有多個屬性。屬性可以是任意用于說明此Entity Bean實例的的數據。某些情況下,用于表示復雜關系的Entity Bean,Primary Key甚至可以是整個Entity Bean。
可以通過定義Entity Bean組件中的Primary Key類,來為組件提供可以任何滿足要求的Primary Key,但必須保證此Primary Key符合Java編程語言中的串行化要求,即Primary Key必須是合法的RMI類型。
客戶端
Entity Bean的客戶端按照客戶端與Entity Bean所處的JVM是否相同,分為遠程客戶和本地客戶。
JNDI
由于Entity Bean運行于EJB容器中,由容器提供對Entity Bean實例的生存周期管理,客戶端不能直接訪問容器中的Entity Bean,容器使客戶端可以通過JNDI訪問Entity Bean的Home接口,客戶端通過Home接口取得對Entity Bean對象的引用,通過引用對容器中的Entity Bean實例進行訪問。
遠程客戶
Entity Bean的遠程客戶端通過Entity Bean的遠程Home接口和遠程接口訪問Entity Bean對象。
Entity Bean的遠程客戶端與運行客戶端的JVM是否與Entity Bean所處JVM是否相同無關,相同或不同JVM中的客戶端都可通過遠程Home接口和遠程接口訪問Entity Bean對象。只是遠程客戶端對Entity Bean進行調用時,其調用通過網絡傳播,參數與返回值必須是合法的RMI類型,并且都按值傳遞。
由于網絡延遲的原因,客戶端通過遠程訪問比本地訪問效率上要差一些,但是,由于遠程訪問與客戶端的位置無關,因此,可以提供Entity Bean的可分布特性,適合粗粒度的對象表示。
Entity Bean的遠程客戶端可以是用Java語言編寫的任意程序類型,如Java應用、applet、Servlet等等,也可以是非Java的客戶端。
本地客戶
Entity Bean的本地客戶通過本地Home接口與本地接口訪問Entity Bean對象。
Entity Bean的本地客戶端必須位于同一個JVM中。
Entity Bean的本地客戶端在對Entity Bean進行調用時,按照標準Java語言中的對象調用方式,其參數和返回值按引用傳遞。
因為不涉及網絡延遲的因素,一般,通過本地訪問,效率要高一些,不過,組件的分布式特性就受到了影響。通過定義本地和遠程的訪問接口,Entity Bean可以同時提供兩種訪問方式,不過,通常只提供二者之一。
具有容器管理關系的EJB,必須提供本地訪問接口
容器與Entity Bean
從Entity Bean實例的產生到清除,它都運行于EJB容器中,容器中可以部署多個Entity Bean,容器提供客戶端對Entity Bean實例的訪問機制,容器為部署的在其中的Entity Bean提供安全、并發、持久等等服務。對于Entity Bean的客戶端而言,容器是透明的。
Entity Bean作為業務數據在應用系統中的對象表示,多個客戶通常會并發地訪問Entity Bean對象,開發者不必提供對并發訪問的支持,通過實例池與事務管理器,EJB容器會保證實例對客戶端請求進行進行高效的響應,并保證實例狀態與數據庫的同步。如果開發者使用了容器管理持久性的Entity Bean,則如何取得與數據庫的連接、如何使用SQL語句操作數據、如何利用資源等等,都可以完全由容器進行處理。開發者只需通過部署描述,對組件的事務、安全等進行聲明即可。
通過JNDI定位遠程Home接口
客戶端可通過JNDI定位Entity Bean的遠程Home接口,JNDI命名空間中可以包含多個部署在容器中的Entity Bean的遠程Home接口。
如下代碼段示意如何通過JNDI定位Entity Bean的遠程Home接口:
Context initialContext = new InitialContext();
AccountHome accountHome = (AccountHome) javax.rmi.PortableRemoteObject.narrow(
initialContext.lookup(“java:comp/env/ejb/accounts”),
AccountHome.class
);
通過JNDI定位本地Home接口
客戶端通過JNDI定位Entity Bean的本地Home接口與定位遠程Home接口的方法非常類似,只是沒有牽涉到遠程訪問的API。
如下代碼段示意如何通過JNDI定位Entity Bean的本地Home接口:
Context initialContext = new InitialContext();
AccountHome accountHome = (AccountHome) initialContext.lookup(
“java:comp/env/ejb/accounts”
);
組件模型
Home接口
根據Entity Bean是否提供遠程或本地訪問,Entity Bean組件必須提供本地或遠程的Home接口。通過JNDI,容器使Home接口可被客戶端訪問。
遠程Home接口
通過Entity Bean的遠程Home接口,開發者向Entity Bean的客戶端提供進行如下操作的方法:
· 創建新的Entity Bean實例;
· 查找已存在的Entity Bean實例;
· 清除Entity Bean實例;
· 執行Home接口中的業務方法;
· 取得Entity Bean的javax.ejb.EJBMetaData接口,javax.ejb.EJBMetaData接口用于表示此Entity Bean的信息,降低客戶端和服務器的綁定程度和用于支持客戶端腳本;
· 取得Home接口句柄(Handler),此句柄可串行化(serialization)到持久存儲中,然后,可在其他虛擬機中,從持久存儲中,對此串行化對象進行解串行化(deserialization),取得對此遠程Home接口句柄的引用;
Entity Bean的遠程Home接口必須擴展(extends)javax.ejb.EJBHome接口,并遵循Java語言的遠程接口標準。
create方法
Entity Bean的遠程Home接口可定義零個或多個create方法,每個create方法提供一種創建Entity Bean實例的方式,create方法中的參數一般被用于初始化Entity Bean實例。每個create方法必須以“create”作為前綴;
遠程Home接口中定義的create方法的返回值必須是Entity Bean的遠程接口,拋出語句必須包含java.rmi.RemoteException和javax.ejb.CreateException異常,同時可包含任意的應用級的異常。
以下代碼段是遠程Home接口中三個create方法的范例:
public interface AccountHome extends javax.ejb.EJBHome {
public Account create(String firstName, String lastName, double initialBalance)
throws RemoteException, CreateException;
public Account create(String accountNumber, double initialBalance)
throws RemoteException, CreateException, LowInitialBalanceException;
public Account createLargeAccount(String firstname, String lastname, double initialBalance)
throws RemoteException, CreateException;
... }
以下是客戶端如何通過create方法創建Entity Bean實例的代碼范例:
AccountHome accountHome = ...;
Account account = accountHome.create(“John”, “Smith”, 500.00);.
finder方法
通過Entity Bean的遠程Home接口,可以定義一到多個finder方法。所謂finder方法,即是開發者提供給客戶端的方法,用于查找某個Entity Bean對象或包含多個Entity Bean對象的集合。遠程Home接口中定義的每個finder方法對應一種查找的方式。finder方法的名稱必須以“find”前綴開始,如:findLargeAccounts(...)。方法中定義的參數,被Entity Bean組件類中的對應實現方法用于定位需要查找的Entity Bean對象或對象集合。
finder方法的返回值類型必須是Entity Bean的遠程接口對象,或是只包含遠程接口對象的集合(Collection)。
每個遠程Home接口中定義的finder方法的拋出語句必須包含對java.rmi.RemoteException異常和javax.ejb.FinderException異常的拋出。
遠程Home接口必須包含一個findByPrimaryKey(primaryKey)方法,客戶端可通過此方法使用Entity Bean的Primary Key對Entity Bean對象進行查找。此方法的唯一參數必須與Entity Bean的Primary Key為同一類型,其返回值必須是Entity Bean的遠程接口類型。
以下代碼范例定義了一個findByPrimaryKey方法:
public interface AccountHome extends javax.ejb.EJBHome {
...
public Account findByPrimaryKey(String AccountNumber) throws RemoteException, FinderException;
}
以下代碼范例是客戶端調用finder方法的方式:
AccountHome = ...;
Account account = accountHome.findByPrimaryKey(“100-3450-3333”);
Remove方法
javax.ejb.EJBHome接口中定義的方法,由于Entity Bean組件的遠程Home接口擴展(extends)javax.ejb.EJBHome接口,因此,客戶端可通過調用Entity Bean的遠程Home接口中的remove方法清除容器Entity Bean實例。
Home方法
作為應用中業務數據的對象表示,Entity Bean通常表示一類業務實體,如雇員信息、訂單、賬戶等等,通常這些實體都會涉及針對所有或部分已存在數據的操作,如對所有雇員的某些信息進行統計,或者對所有雇員增加花紅等等,這些操作不涉及單個的Entity Bean實例。
Entity Bean組件模型中,可以通過在遠程Home接口中定義Home方法,提供對不涉及單個特定的Entity Bean實例的操作。
在遠程Home接口中定義的Home方法必須拋出java.rmi.RemoteException異常,可拋出任意應用級異常。同時,其參數類型和返回值類型必須是合法的RMI類型。
下面是兩個Home方法的范例代碼:
public interface EmployeeHome extends javax.ejb.EJBHome {
...
// this method returns a living index depending on
// the state and the base salary of an employee:
// the method is not specific to an instance
public float livingIndex(String state, float Salary) throws RemoteException;
// this method adds a bonus to all of the employees
// based on a company profit-sharing index
public void addBonus(float company_share_index)
throws RemoteException, ShareIndexOutOfRangeException;
...
}
本地Home接口
通過Entity Bean的本地Home接口,開發者向Entity Bean的客戶端提供進行如下操作的方法:
· 創建新的Entity Bean實例;
· 查找已存在的Entity Bean實例;
· 清除Entity Bean實例;
· 執行Home接口中的業務方法;
Entity Bean的本地Home接口必須擴展(extends)javax.ejb.EJBLocalHome接口
create方法
Entity Bean的本地Home接口可定義零個或多個create方法,每個create方法提供一種創建Entity Bean實例的方式,create方法中的參數一般被用于初始化Entity Bean實例。每個create方法以“create”作為前綴;
本地Home接口中定義的create方法的返回值必須是Entity Bean的遠程接口,拋出語句不可包含java.rmi.RemoteException異常,可包含任意的應用級的異常,必須包含javax.ejb.CreateException異常。
以下代碼段是本地Home接口中三個create方法的范例:
public interface AccountHome extends javax.ejb.EJBLocalHome {
public Account create(String firstName, String lastName, double initialBalance)
throws CreateException;
public Account create(String accountNumber, double initialBalance)
throws CreateException, LowInitialBalanceException;
public Account createLargeAccount(String firstname, String lastname, double initialBalance)
throws CreateException;
...
}
以下是客戶端如何通過create方法創建Entity Bean實例的代碼范例:
AccountHome accountHome = ...;
Account account = accountHome.create(“John”, “Smith”, 500.00);
finder方法
通過Entity Bean的本地Home接口,可以定義一到多個finder方法。所謂finder方法,即是開發者提供給客戶端的方法,用于查找某個Entity Bean對象或包含多個Entity Bean對象的集合。本地Home接口中定義的每個finder方法對應一種查找的方式。finder方法的名稱必須以“find”前綴開始,如:findLargeAccounts(...)。方法中定義的參數,被Entity Bean組件類中的對應實現方法用于定位需要查找的Entity Bean對象或對象集合。
finder方法的返回值類型必須是Entity Bean的本地接口對象,或是只包含本地接口對象的集合(Collection)。
每個本地Home接口中定義的finder方法的拋出語句必須包含javax.ejb.FinderException異常的拋出,不可包含java.rmi.RemoteException異常。
本地Home接口必須包含一個findByPrimaryKey(primaryKey)方法,客戶端可通過此方法使用Entity Bean的Primary Key對Entity Bean對象進行查找。此方法的唯一參數必須與Entity Bean的Primary Key為同一類型,其返回值必須是Entity Bean的本地接口類型。
以下代碼范例定義了一個findByPrimaryKey方法:
public interface AccountHome extends javax.ejb.EJBLocalHome {
...
public Account findByPrimaryKey(String AccountNumber) throws FinderException;
}
以下代碼范例是客戶端調用finder的方式:
AccountHome = ...;
Account account = accountHome.findByPrimaryKey(“100-3450-3333”);
Remove方法
javax.ejb.EJBLocalHome接口中定義的方法,由于Entity Bean組件的本地Home接口擴展(extends)javax.ejb.EJBLocalHome接口,因此,客戶端可通過調用Entity Bean的本地Home接口中的remove方法清除容器Entity Bean實例。
Home方法
作為應用中業務數據的對象表示,Entity Bean通常表示一類業務實體,如雇員信息、訂單、賬戶等等,通常這些實體都會涉及針對所有或部分已存在數據的操作,如對所有雇員的某些信息進行統計,或者對所有雇員增加花紅等等,這些操作不涉及單個的Entity Bean實例。
Entity Bean組件模型中,可以通過在本地Home接口中定義Home方法,提供對不涉及單個特定的Entity Bean實例的操作。
每個Home方法的拋出語句可以包含任意應用級異常的拋出,不能拋出java.rmi.RemoteException異常。
下面是兩個Home方法的范例代碼:
public interface EmployeeHome extends javax.ejb.EJBLocalHome {
...
// this method returns a living index depending on
// the state and the base salary of an employee:
// the method is not specific to an instance
public float livingIndex(String state, float Salary);
// this method adds a bonus to all of the employees
// based on a company profit-sharing index
public void addBonus(float company_share_index) throws ShareIndexOutOfRangeException;
...
}
Primary Key
同一個Entity Bean組件的每個實例,都擁有一個用于標識實例的同一類型的Primary Key,如果兩個Entity Bean對象擁有相同的Home接口,擁有相同的Primary Key,即可認為這兩個Entity Bean對象相等。
Entity Bean的Primary Key可以是任何合法的RMI類型。每個Entity Bean都必須指定其唯一的Primary Key的類型,不同的Entity Bean可以使用相同的primary key類型。客戶端可通過Entity Bean實例的組件接口引用,調用getPrimaryKey()方法,取得實例關聯的Primary Key對象。
在整個Entity Bean實例的生存周期中,其關聯的Primary Key對象不會發生改變,即在生存周期內,客戶端調用實例的getPrimaryKey()方法返回的Primary Key對象是相同的。如果實例同時擁有遠程接口和本地接口,則這兩個接口的getPrimaryKey()方法返回的Primary Key對象也是相同的。
因此,客戶端除了可以使用組件接口中的isIdentical方法判斷兩個Entity Bean實例是否相等之外,也可使用實例關聯的Primary Key對象的equals方法進行判斷。
下面是使用isIdentical方法判斷兩個對Entity Bean實例的引用是否相等的代碼范例:
Account acc1 = ...;
Account acc2 = ...;
if (acc1.isIdentical(acc2)) {
//acc1 and acc2 are the same entity object
} else {
//acc2 and acc2 are different entity objects
}
知道Entity Bean實例的Primary Key的客戶端,可以使用Home接口中定義的findByPrimaryKey方法,取得對Entity Bean實例組件接口的引用。
注意 |
|
當判斷兩個Entity Bean實例引用是否相等,不可使用“==”運算符,只可使用Primary Key對象的equals方法或組件接口的isIdentical方法進行判斷。 |
組件接口
客戶端通過Entity Bean提供的組件接口訪問Entity Bean對象。開發者必須為組件提供組件接口,并在組件接口中對客戶所能調用的業務方法進行定義。
根據Entity Bean是否提供遠程或本地訪問,組件接口分為遠程接口和本地接口。
遠程接口
Entity Bean組件中的遠程接口必須擴展(extends)javax.ejb.EJBObject接口。并在其中定義可供客戶端調用業務方法。業務方法的拋出語句必須包含java.rmi.RemoteException異常,可包含任意的應用級異常。
下面是Entity Bean組件遠程接口的范例代碼:
public interface Account extends javax.ejb.EJBObject {
void debit(double amount) throws java.rmi.RemoteException, InsufficientBalanceException;
void credit(double amount) throws java.rmi.RemoteException;
double getBalance() throws java.rmi.RemoteException;
}
javax.ejb.EJBObject提供為客戶端提供對Entity Bean對象引用進行如下操作的方法:
· 取得Entity Bean對象的遠程Home接口;
· 清除Entity Bean對象;
· 取得Entity Bean對象的句柄;
· 取得Entity Bean對象的Primary Key。
容器為以上操作提供實現,開發者只需在Entity Bean的組件類中提供對遠程接口中定義的業務方法的實現。
本地接口
Entity Bean組件中的本地接口必須擴展(extends)javax.ejb.EJBLocalObject接口。并在其中定義可供客戶端調用的業務方法。業務方法的拋出語句不能包含java.rmi.RemoteException異常,可包含任意的應用級異常。
下面是Entity Bean組件本地接口的范例代碼:
public interface Account extends javax.ejb.EJBLocalObject {
void debit(double amount) throws InsufficientBalanceException;
void credit(double amount);
double getBalance();
}
javax.ejb.EJBLocalObject提供為客戶端提供對Entity Bean對象引用進行如下操作的方法:
· 取得Entity Bean對象的本地Home接口;
· 清除Entity Bean對象;
· 取得Entity Bean對象的Primary Key。
容器為以上操作提供實現,開發者只需在Entity Bean的組件類中提供對本地接口中定義的業務方法的實現。
組件類
由于Entity Bean具有兩種不同的持久類型,Bean管理持久性(Bean-managed Persistence,BMP)和容器管理持久性(Container-managed Persistence,CMP),兩種持久類型的組件類的開發方式具有較多的不同。因此,將在以下兩章中分別對這兩種持久性類型的Entity Bean進行介紹,并對不同持久類型的組件類的開發進行描述。
生存周期
Entity Bean對象的生存周期
上圖是Entity Bean生存周期內的狀態圖。
在容器創建了Entity Bean實例之后,調用Entity Bean組件類的setEntityContext方法,將Entity Bean的上下文傳遞到實例。
實例化之后,Entity Bean被轉移到實例池成為可用實例。實例池中的實例沒有任何標識,只有在實例進入就緒狀態時,容器將為實例分配標識。
實例有兩種方式從實例池進入就緒狀態。一種方式是客戶端調用了Entity Bean的Home接口的create方法,使容器調用Entity Bean的ejbCreate和ejbPostCreate方法;另一種方式是容器調用Entity Bean的ejbActivate方法。
當實例進入就緒狀態之后,即可對實例的業務方法進行調用。
同樣,實例也有兩種方式從就緒狀態進入實例池。一種方式是客戶端調用了remove方法,使容器調用Entity Bean的ejbRemove方法;另一種方式是容器調用Entity Bean的ejbPassivate方法。
當Entity Bean實例的生命周期結束,容器將Entity Bean從實例池中移出,并調用Entity Bean的unsetEntityContext方法