2012-01-21 52 views
16

我正在閱讀EJB 3 in Action書籍,我有以下問題:
POJO是否使用@Entity等編寫和註釋,也是EJB實體類型?EJB和JPA如何關聯?

我不明白JPA與EJB有什麼關係。 JPA現在不是自己的規範嗎?實體也包含在自己的持久性容器中。他們談論EJB 3 Java持久性API等,但我不明白實體與EJB有什麼關係。

+0

你的問題是真棒。 –

回答

15

JPA被設計爲替代EJB2實體bean,並且已經開始作爲EJB3規範的一部分。

因爲在EJB容器外部也使用JPA是有意義的,所以它現在有了它自己的規範,但它仍然與EJB3相關,因爲兼容的EJB3容器必須提供一個JPA實現,它集成到事務處理的容器。

+0

因此,即使EJB規範不再那麼緊密,EJB規範也需要一個實現,這就是爲什麼它被看作EJB世界中的第三種組件類型? – LuckyLuke

+1

EJB2具有「實體豆」,它是第三種類型的組件。 EJB3有JPA,它有「實體」。但我認爲他們不再被視爲「EJB組件」。他們只是被稱爲JPA實體。 –

3

你說得對。 JPA比只支持EJB有更多的事情要做。這就是JPA成爲單獨的JSR或規範的原因。 EJB在其規範中使用或啓用了JPA,因爲JPA是一個很好的標準。如果設計正確,您現在可以在不更改代碼的情況下在JPA供應商之間切換

可以獨立於JPA使用EJB規範(儘管JPA已被包含爲EJB規範的一部分),同樣,JPA也可以用於EJB規範之外的更多內容。儘管如此,EJB規範還是可以非常輕鬆地將JPA Entitiy Manager(及其用法)注入其bean中,從而使編程變得更加簡單。當然,現在可以使用CDI上的新JSR輕鬆實現:-)。

所有支持EJB規範的應用程序服務器都應該支持JPA。你可以看到this thread獲取更多信息。

8

直到版本2.1的EJB規範,實體bean類必須實現javax.ejb.EntityBean接口,併爲樣板方法(如ejbLoad,ejbStore,ejbActivate和ejbPassivate)提供實現。

EJB 3.0採用了JPA規範。一個實體bean的概念被JPA實體的簡單概念所取代。要創建這樣的實體,不需要接口實現或鍋爐板方法。該實體是具有@Entity註釋的POJO。

因此,在實踐中使用的Java EE應用程序「實體Bean」的EJB是死的(JPA埋)作爲EJB的3