EnterPRise JavaBean (EJB) 是可重用的、可移植的 J2EE 組件。EJB 由封裝業務邏輯的方法組成。譬如說,EJB 可能有這樣的業務邏輯:包含了更新數據庫中客戶數據的方法。眾多遠程和本地客戶端可以調用該方法。另外,EJB 在容器里面運行,這樣開發人員只要關注bean里面的業務邏輯,不必擔心復雜、輕易出錯的問題,譬如事務支持、安全性和遠程對象訪問等。EJB 作為普通Java對象(POJO)的形式來開發,開發人員可以使用元數據注釋(metadata annotations)來指定容器如何治理這些bean。
EJB 包括三種主要類型:會話 bean、實體 bean和消息驅動的bean。會話bean執行獨立的、解除耦合的任務,譬如檢查客戶的信用記錄。實體bean是一個復雜的業務實體,它代表數據庫中存在的業務對象。消息驅動的bean用于接收異步JMS 消息。下面,讓我們進一步研究EJB 3.0規范中的這些類型。
一、會話bean
會話bean通常代表業務流程里面的操作,譬如“處理訂單”。可根據對話狀態的保持性,即有狀態和無狀態對會話bean進行分類。
無狀態的會話 bean沒有內部狀態。它們不跟蹤記錄從一個方法調用傳遞到另一個方法調用的信息。因此,每次調用無狀態的業務方法都獨立于前一次調用,譬如計算稅款或者運費。用某個應稅值調用計算稅款的方法時,對稅款值進行計算并返回給調用方法,而不必保存調用者的內部狀態供以后調用。因為這些bean并不保持狀態,所以容器對它們進行治理就很簡單??蛻舳苏埱鬅o狀態的bean實例時,可以從容器保持的無狀態的會話bean 實例池當中接收一個實例。另外,因為無狀態的會話 bean可以共享,所以容器可保持數量較少的實例為許多客戶端提供服務。想指定Java Bean作為無狀態的會話bean加以部署及治理,只需要為該bean添加注釋@Stateless。
有狀態的會話 bean在方法調用時可保持對話狀態,譬如客戶的網上購物車。客戶開始網上購物時,可以從數據庫中檢索客戶的具體信息。客戶往購物車里面添加商品或者從里面刪除商品、下訂單等時調用的其他方法也可以使用這些具體信息。不過,有狀態的會話bean是暫時性的,因為出現會話終止、系統崩潰或者網絡故障后,狀態不復存在??蛻舳苏埱笥袪顟B的會話bean實例時,就為該客戶端分配一個有狀態的實例,并為該客戶端保持該組件的狀態。要指定容器在某個方法完成后刪除有狀態的會話bean實例,只要為該方法添加注釋@Remove。
會話 bean示例如下:
import javax.ejb.Stateless.*;
/*A simple stateless session bean implementing the incrementValue() method of the * CalculateEJB interface.*/
@Stateless(name="CalculateEJB")
public class CalculateEJBBean
implements CalculateEJB
{
int value = 0;
public String incrementValue()
{
value++;
return "value incremented by 1";
}
}
二、實體bean
實體bean是治理持久性數據的一個對象,有可能使用幾個相關的Java對象,并可以通過主鍵實現惟一性。通過添加@Entity注釋,可以把某類指定為實體bean。實體bean代表數據庫中的持久性數據,如客戶表中的一行或者員工表中的一條員工記錄。實體bean還可以在多個客戶端之間共享。譬如說,某個員工實體bean可以由多個客戶端用于計算某員工的年薪或者更新員工地址。實體bean對象的特定字段可以成為持久性字段。實體bean中沒有被@Transient注釋標記的所有字段都被視為持久性字段。EJB 3.0的一個主要特性就是,能夠使用元數據注釋來創建包含對象/關系映射的實體bean。譬如說,想指定把實體bean的empId字段映射到 Employees表中的EMPNO屬性,就要使用@Table(name="Employees") 來注釋表名,使用 @Column(name="EMPNO") 來注釋字段,如下面的例子所示。另外,EJB 3.0 的一個特性是,在開發期間可以方便地測試實體bean,因為現在使用 Oracle 應用服務器實體測試工具,就可以在容器外面運行實體bean。
實體 bean示例如下:
import javax.persistence.*;
import java.util.ArrayList;
import java.util.Collection;
@Entity
@Table(name = "EMPLOYEES")
public class Employee implements java.io.Serializable
{
private int empId;
private String eName;
private double sal;
@Id
@Column(name="EMPNO", primaryKey=true)
新聞熱點
疑難解答