2010-02-24 233 views
3

我在哪裏工作,坐在我對面的人正在開發一個項目。這是一個使用Struts,Spring,EJB 3.0,JPA和Hibernate 3.0的JavaEE應用程序。他們使用帶註釋的EJB 3.0實體bean。我一直在問他們爲什麼Hibernate 3.0在這個混合中,沒有人能夠告訴我。感覺就像他們已經包含Hibernate 3.0一樣,因爲他們被告知但並未將它用於EJB 3.0實體bean/JPA無法獲取的任何內容。他們使用CMP並通過EJB訪問所有數據庫功能。使用Hibernate 3.0與EJB 3.0和JPA

Hibernate可以爲您提供此設置中無法由EJB 3.0/JPA提供的任何內容嗎?

+0

您使用的是什麼應用程序服務器? – 2010-02-24 20:34:57

+0

@Chris Dail - 他們正在使用Websphere 6.1 – 2010-02-25 12:03:17

回答

2

JPA本身只是一個規範而不是產品,它本身不能執行持久化或其他任何事情。 JPA只是一組接口,需要實現(持久性提供者)。有開源和商業JPA實現(Toplink Essentials,EclipseLink,Hibernate EntityManager,OpenJPA,Kodo等)和任何Java EE 5(或Java EE 6)應用程序服務器必須爲其提供支持(JBoss使用Hibernate EntityManager,GlassFish v2默認情況下使用Toplink Essentials,GlassFish v3默認使用EclipseLink,WebLogic默認使用Kodo等)。

現在,使用JPA的好處之一是它可以在容器之外使用,例如在Java SE應用程序或測試環境中(這是EJB 2.x的一個大問題)。但是在這種情況下,需要提供一個實現,因爲你不會得到容器提供的那個。正如我們所看到的,Hibernate EntityManager--它建立在Hibernate Core之上 - 就是其中之一,這可以解釋爲什麼你會看到它。

請注意,大多數(所有?)容器提供了一種方法來替換它們提供的默認實現。例如,可以使用Hibernate代替帶Weblogic的Kodo,或使用GlassFish代替EclipseLink。這可能是你在混音中看到它的另一個原因。

4

Hibernate確實有一個JPA實現,但它也可以單獨使用。在JavaEE中可以使用Hibernate作爲持久性提供者。例如,JBoss應用程序服務器使用Hibernate來實現其持久性。因此,如果您使用Hibernate在應用程序服務器中提供持久性,則可能有意義。

如果您使用的是不使用Hibernate進行持久性應用程序服務器,那麼您聽起來可能不需要它。 Hibernate確實有一些擴展和JPA中沒有的東西。許多其他持久性提供商也有這些擴展(如Toplink或Eclipselink)。檢查你的應用程序服務器提供的信息,看看它們是否有你可能需要的擴展或類似於你在Hibernate中使用的擴展。