Spring+JPA,下一個(gè)人氣組合?
Spring + Hibernate 常常被稱為 Java Web 應(yīng)用背后人氣最旺的框架組合。盡管 JCP 今天通過(guò)的 Web Beans JSR 打算將JSF + EJB + JPA 、來(lái)自 JBoss Seam(Spring 除外)的一些組件和EJB 3(目前能夠提供有基本攔截和依賴注入功能的簡(jiǎn)化 Session Bean 框架)的一個(gè) Web 組合進(jìn)行標(biāo)準(zhǔn)化,現(xiàn)在 Spring 2.0 為 JPA 提供了完整的 EJB 容器契約,允許 JPA在任何環(huán)境內(nèi)可以在 Spring 管理的服務(wù)層使用(包括 Spring 的所有 AOP 和 DI 增強(qiáng))。關(guān)于下一個(gè)實(shí)際組合會(huì)是 EJB、Spring + Hibernate 還是 Spring + JPA 的論戰(zhàn),早已充斥于耳。
在 Tomcat 和 Geronimo 上,我們已經(jīng)能看見(jiàn)獨(dú)立使用 JPA 的演示范例。但這個(gè)方法存在一些局限性,例如,在同一個(gè)事務(wù)內(nèi)部,我們無(wú)法跨實(shí)體管理器(Entity Managers)自動(dòng)共享持久化上下文環(huán)境(Persistence Context)。Spring 通過(guò)實(shí)現(xiàn) EJB 容器契約,允許在相同事務(wù)內(nèi)以跨組件方式注入持久對(duì)象,同時(shí)也具備讓組件連接事務(wù)的能力,并允許對(duì)擴(kuò)展持久化上下文環(huán)境的支持。因此,Spring 2 允許隨同容器內(nèi)部支持的所有功能特性一起使用 JPA。
最近,Mark Fisher 在獨(dú)立環(huán)境中使用來(lái)自 Glassfish 的 Toplink Essentials JPA 參考實(shí)現(xiàn)向大家演示了如何配合 Spring 使用 JPA。Mark 選取了一個(gè)簡(jiǎn)單的 JPA 領(lǐng)域模型,并展示了如何讓它在 Spring 中運(yùn)行:
我打算擴(kuò)展 Spring 的 JpaDaoSupport 類,這個(gè)類提供了獲取 JpaTemplate 的便利方法。如果你以前就在 Spring 下使用過(guò) ODBC 或者其他的 ORM 技術(shù)的話,那么想必你對(duì)這種方法已經(jīng)頗有了解了。應(yīng)當(dāng)注意的是,JpaDaoSupport 的使用是可選的。我們可以通過(guò)將 EntityManagerFactory 傳給 JpaTemplate 的構(gòu)造子的方式來(lái)創(chuàng)建 JpaTemplate 對(duì)象。事實(shí)上,JpaTemplate 本身就是可選的。如果你不希望 JPA 異常被自動(dòng)轉(zhuǎn)換成 Spring 的運(yùn)行期異常層級(jí)結(jié)構(gòu)(runtime exception hierarchy),那么你就可以完全不必使用 JpaTemplate 了。在這種情況下,你可能仍然對(duì) Spring 的 EntityManagerFactoryUtils 類感興趣,因?yàn)檫@個(gè)類提供了一個(gè)類方法,它能幫助你很方便地獲取共享的(因此也是事務(wù)性的)EntityManager。
同時(shí),Spring 2.0 文檔也已經(jīng)更新了一個(gè)新的章節(jié),使用與 Hibernate 或 TopLink 相同的方式展示了如何支持 JPA。Rod Johnson 在 Java One 大會(huì)上向 InfoQ 表示,Spring 在確保 JPA 整合的可移植性方面做出了很多努力,目的是為了保證在 Hibernate、TopLink 和 OpenJPA 等 JPA 提供商之間進(jìn)行切換變得更加容易。
最近,Spring 的 Pitchfork 項(xiàng)目(向 WebLogic 提供完整 EJB API 的一部分)被用于演示如何在 Tomcat 上完整地部署 EJB,盡管在 Tomcat 上使用 Spring 運(yùn)行完整 EJB 的方法并不打算用于生產(chǎn)用途,Rod Johnson 表示“其目的并不是為了寫(xiě)出一個(gè) EJB 容器”。JBoss 同樣也提供了一個(gè)可嵌入的 EJB 容器,可以在具備一定局限性的條件下在 Tomcat 上運(yùn)行 EJB 3。
上周,Gavin King 和不少 Spring 團(tuán)隊(duì)人員之間就 JBoss 和 EJB 3 vs. Spring“類 EJB 容器”(這是 Gavin 的叫法)問(wèn)題爆發(fā)了一場(chǎng)大規(guī)模舌戰(zhàn)。Spring 團(tuán)隊(duì)主張,JPA 是新 EJB 規(guī)范的主要價(jià)值所在,而在依賴注入和 AOP 能力方面,Session Bean 僅僅是 Spring 的很小的子集。他們?cè)诹ν?Spring + JPA。Gavin King 反擊說(shuō),他們(Spring 團(tuán)隊(duì))試圖通過(guò)力推 Spring 的方式,進(jìn)一步加強(qiáng) Spring 的市場(chǎng)鎖定,而不是“通過(guò)規(guī)范提供的擴(kuò)展點(diǎn)為 EJB 3 創(chuàng)建附加組件”。
在2006 和 2007 年,在事務(wù)性和持久性 Java Web 應(yīng)用開(kāi)發(fā)的下一個(gè)實(shí)際標(biāo)準(zhǔn)領(lǐng)域,必將涌現(xiàn)出許多競(jìng)爭(zhēng)和創(chuàng)新。目前看來(lái),存在三個(gè)陣營(yíng),Sun/JCP、JBoss 和 Spring。社區(qū)將齊聚 EJB 陣營(yíng)還是仍然對(duì)其嗤之以鼻?是繼續(xù)固守 Spring + JPA 還 Spring + Hibernate 陣營(yíng)?當(dāng) Web Beans 規(guī)范最終敲定時(shí),事態(tài)將會(huì)變得更加引人注目。InfoQ 將持續(xù)為您追蹤報(bào)道它們每一步發(fā)生的變化與創(chuàng)新。
您正在閱讀:Spring+JPA,下一個(gè)人氣組合?
【編輯推薦】























