2010-07-26 58 views

回答

1

EJB規範支持瞬態和持久對象。瞬態對象被稱爲會話bean,而持久對象被稱爲實體bean。

A Session Bean 

會話bean是由客戶端創建的EJB,通常只存在於單個客戶端 - 服務器會話期間。會話bean通常代表客戶端執行諸如計算或數據庫訪問等操作。雖然會話bean可能是事務性的,但如果發生系統崩潰則無法恢復。會話bean對象可以是無狀態的,也可以在方法和事務之間保持會話狀態。如果會話bean維護一個狀態,那麼如果必須從內存中刪除該對象,則EJB容器將管理此狀態。但是,持久數據必須由會話bean對象本身來管理。

容器工具在部署時爲會話bean生成附加類。這些工具通過檢查其類和接口從EJB體系結構中獲取信息。這些信息被用來動態生成兩個實現bean的home和remote接口的類。這些類使容器能夠調用會話bean上的所有客戶端調用。容器也生成一個可序列化的Handle類,它提供了一種在特定生命週期內識別會話bean實例的方法。可以實現這些類,以便在與容器特定的代碼混合時執行自定義的操作和功能。

除了這些自定義類以外,每個容器還提供了一個爲客戶端提供元數據並實現SessionContext接口的類。這可以訪問有關調用bean的環境的信息。

An Entity Bean 

實體bean是永久數據存儲庫(如數據庫)中維護的持久性數據的對象表示形式。主鍵標識實體bean的每個實例。實體bean是事務性的,在發生系統崩潰時可以恢復。

實體bean是顯式數據或數據集合的表示,例如關係數據庫中的行。實體bean方法提供了對bean的數據表示進行操作的過程。一個實體bean是持久的,只要它的數據保留在數據庫中就可以存活。

可以通過兩種方式創建實體bean:通過在bean的home接口上調用create()方法的客戶機的直接操作,或者通過向數據庫添加數據的其他操作(bean類型代表。事實上,在包含遺留數據的環境中,甚至可以在部署EJB之前存在實體對象。

實體bean可以實現bean管理的或容器管理的持久性。對於bean管理的持久性,實體bean的實現者通過直接的數據庫調用來存儲和檢索bean管理的信息。該bean可以爲這種方法使用Java數據庫連接(JDBC)或SQL-Java(SQLJ)。 (會話bean也可以訪問他們使用JDBC或SQLJ管理的數據。)這種方法的一個缺點是它使得更容易將bean管理的持久性調整爲替代數據源。

對於容器管理的持久性,容器提供者可以使用標準API實現對數據庫的訪問。容器提供者可以提供工具來映射實體bean的實例變量以調用底層數據庫。這種方法使得使用具有不同數據庫的實體bean更容易。

+1

這些天來,我們使用JPA,而不是Entity Beans – djna 2010-07-26 06:27:16

+1

當然,用於對象關係映射的POJO持久化模型是非常好的。我只是試圖清除會話bean和實體bean之間的區別。 – Rupeshit 2010-07-26 06:55:06

2

兩者都允許您編寫從數據庫中獲取數據的Java數據庫,但實際編碼是非常不同的。

JDBC允許您編寫SQL代碼

INSERT INTO ... 

SELECT ... WHERE 

然後,您必須編寫自己的代碼到你的Java對象和JDBC代碼之間傳輸數據。最終會出現很多反覆的「將該字段放在該列中」類型的代碼。

看看例如link text的例子來得到一種風味。

在JPA/Hibernate中,您只需使用關於哪些表和列與字段對應的說明來註釋Java類。大大減少了你需要編寫的代碼量。

這是因爲這個例子中(從this JPA example視爲簡單:

@Entity 
public class Inventory { 
    @Id 
    protected long id; 
    ... 
    public void setItem(Item item) { 
     this.item = item; 
     this.id = item.getSKU(); 
    } 
    ... 
} 

我要說的是會話Bean + JPA比會話Bean + JDBC的努力相當少