JPA與Hibernate的優(yōu)缺點
Java Persistence API
從 EJB 技術(shù)可以開始應(yīng)用時起,對其在實際應(yīng)用中的可用性就一直存在懷疑。在我看來,產(chǎn)生這種現(xiàn)象最重要的兩個原因是復(fù)雜性和資源密集性。結(jié)果,隨后出現(xiàn)了比 EJB 更簡單、具有更小資源空間的框架(比如 Spring 和 Hibernate),并且更快流行開來。為了說明這一點,我們注意到 EJB 3.0 規(guī)范的方向相對以前出現(xiàn)了一個主要的轉(zhuǎn)變。作為 JSR 220 的一部分,該規(guī)范提供了類似 Plain Old Java Object (POJO) 支持、Dependency Injection(依賴注入)和注釋等功能。現(xiàn)在引入了一組全新的 API:Java Persistence API (JPA),以允許開發(fā)者管理 Java EE(甚至 SE)應(yīng)用程序中的關(guān)系數(shù)據(jù)。另外,Sun 聲稱 Java Persistence API 表現(xiàn)了一些 Hibernate、TopLink(二者都會在稍后討論)、JDO 以及 EJB 框架中***的想法。
當(dāng)前,GlassFish 項目提供了實施 JPA 的一個參考,JPA 在 GlassFish 應(yīng)用程序服務(wù)器中作為 TopLink Essential 部分。您可以在 GlassFish 社區(qū)頁 找到該 JPA 參考實施。不要混淆 TopLink Essentials 和 TopLink,前者現(xiàn)在是由 Oracle Corporation 擁有的關(guān)系映射工具。稍后我將在本文中討論 TopLink 框架。
讓我們來討論一些您應(yīng)該考慮應(yīng)用 JPA 作為持久化框架的應(yīng)用場景。
何時考慮將JPA作為持久化框架
您選擇從流行的框架(比如 Hibernate、TopLink 和 EJB)中選擇應(yīng)用具有“好用”的功能且基于標(biāo)準(zhǔn)的框架。
您需要輕量級的持久化框架,且不需要 EJB 的容器提供的服務(wù)。
您需要可以在標(biāo)準(zhǔn)或 Enterprise Java 應(yīng)用程序中使用的持久化框架。
何時考慮JPA的備選方案
您使用的 Java 的版本決定了實際是否可以應(yīng)用 JPA。JPA 是 EJB 3.0 規(guī)范的一部分,而該規(guī)范是 Java EE 5 版本的一部分。如果您未更新到 Java EE 5,則無法使用 JPA。
您的應(yīng)用程序需要 JPA 無法提供的服務(wù),比如那些由 EJB 容器提供的服務(wù),在那些情況下您更依賴 EJB。
在結(jié)束對此框架的討論前,讓我們列出一些使用 JPA 作為持久化框架的優(yōu)勢和缺點。
JPA有什么優(yōu)勢?
JPA 是基于標(biāo)準(zhǔn)的。越來越多的提供商期待在不久的將來提供 JPA 實施。
它提供了 Hibernate 和 TopLink 中***的功能。
它可以和 Java SE 和 Java EE 應(yīng)用程序一起使用,需要使用 EJB 容器,也可以不要。
JPA有什么缺點?
由于非常新,JPA 規(guī)范可能還需要進過重要發(fā)展才會變得很穩(wěn)定。
JPA 是一個規(guī)范而不是一個產(chǎn)品。您需要提供商提供一個實施,才能獲得這些基于標(biāo)準(zhǔn)的 API 的優(yōu)勢。
Hibernate
Hibernate 是一個對象持久化框架,簡化了 Java 應(yīng)用程序和底層關(guān)系數(shù)據(jù)庫之間的對象關(guān)系映射。方法是提供 POJO 的透明持久化,作為“中介”層來提供自動持久化,并從 Java 應(yīng)用程序加載對象到數(shù)據(jù)庫表。借助 Hibernate,保存對象狀態(tài)到數(shù)據(jù)庫和從數(shù)據(jù)庫加載對象狀態(tài)與調(diào)用 Java 對象中的方法一樣容易。您無需從您的應(yīng)用程序代碼中管理底層的數(shù)據(jù)操作;Hibernate 框架會為您完成所有的中間步驟。
讓我們討論一些您將會考慮應(yīng)用 Hibernate 作為持久化框架的應(yīng)用場景,以及那些您將尋求備選方案的應(yīng)用場景。
何時使用Hibernate作為持久化框架
您正在尋求一個簡單的持久化框架,該框架容易學(xué)習(xí)和使用。在您能夠?qū)嶋H開始持久化您的 Java 對象到目標(biāo)數(shù)據(jù)庫之前,您只需要了解幾個映射配置文件。
您正在尋求一個非常普通和靈活的持久化框架。Hibernate 的用法非常靈活:無論是否有應(yīng)用程序服務(wù)器都可以使用,無論是否有關(guān)系數(shù)據(jù)庫系統(tǒng)也可以使用。
您不想支付獲取和維護費用。Hibernate 是開源而且免費的。
Hibernate 框架非常值得應(yīng)用,因為它非常簡單和靈活,同時也很強大。但是,在以下一些應(yīng)用場景中您可能想要考慮應(yīng)用其他框架。
何時考慮Hibernate的備選框架
您還不想要其他框架。盡管簡單,Hibernate 框架仍然有自己的學(xué)習(xí)曲線、維護/更新周期,等等。
您需要容器提供的服務(wù),比如那些由 EJB 提供的服務(wù),在那些情況下您的選擇局限于 EJB。
如果您正在使用或計劃使用 Hibernate 作為您的持久化框架,這里是一些它的優(yōu)勢和缺點。
Hibernate有什么優(yōu)勢?
Hibernate 易于學(xué)習(xí)和使用。正如我在上面提到的,在您可以使用它之前,您只需要了解幾個簡單、自我描述的配置文件。
它 非常靈活。您可以在任何需要持久化服務(wù)的應(yīng)用程序架構(gòu)中使用 Hibernate。您可以通過 Servlet 和/或 Enterprise Java Bean 在 Standard Java 應(yīng)用程序、Enterprise Java 應(yīng)用程序中使用它。它也可以和 Spring 框架很好地集成。
它可以很好地向上擴展,因為它被設(shè)計為從底層一直到集群環(huán)境中工作。通過類似 Lazy Initialization 的技術(shù)以及通過 CGLIB 運行時間字節(jié)代碼生成庫優(yōu)化 Java 反射,***版的 Hibernate 的性能也得到了加強。
Hibernate有什么缺點?
Hibernate 是另一個擁有自己的應(yīng)用和維護周期的框架。
盡管有積極的社區(qū)支持,但是有時候缺乏專注于此產(chǎn)品的提供商也使得宣傳應(yīng)用此框架顯得沒有說服力。
【編輯推薦】