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