?
? ????? PHP ??? ???? ??? ?? ??
目錄
SessionFactory
HibernateTemplate
PersistenceManagerFactory
JdoTemplate
和JdoDaoSupport
JdoDialect
SessionFactory
抽象層TopLinkTemplate
and
TopLinkDaoSupport
SqlMapClientTemplate
和 SqlMapClientDaoSupport
JpaTemplate
和 JpaDaoSupport
JpaDialect
Spring Framework在資源管理,DAO實現(xiàn)支持以及事務(wù)策略等方面提供了與 Hibernate、JDO、Oracle TopLink、iBATIS SQL Mappings 以及 JPA 的集成。 以Hibernate為例,Spring通過使用許多IoC的便捷特性對它提供了一流的支持,幫助你處理很多典型的Hibernate整合的問題。 所有用于支持O/R(對象關(guān)系)映射的包,都遵循Spring通用的事務(wù)和DAO異常體系。通常來說有兩種不同的整合風格:你可以使用Spring提供的DAO模板,或者直接使用Hibernate/JDO/TopLink等工具的原生API編寫DAO。 無論采取哪種風格,這些DAO都可以通過IoC進行配置,并參與到Spring的資源和事務(wù)管理中去。
當用戶選擇O/R Mapping來創(chuàng)建數(shù)據(jù)訪問的應(yīng)用時,Spring提供了強大的支持。 首先應(yīng)該了解的是,一旦使用了Spring對O/R Mapping的支持,你不需要親自做所有的事情。 無論如何,在決定花費力氣并冒著風險去構(gòu)造類似的內(nèi)部底層架構(gòu)之前,我們都建議你考慮和使用Spring的解決方案。 無論您采用何種技術(shù),Spring對大部分O/R Mapping的支持都可以以library的形式被調(diào)用,因為所有的內(nèi)容都被設(shè)計成一組可重用的JavaBeans。 在Spring的IoC容器中使用這些類,更是有著配置和部署簡單的好處。 因而,在這一章中你看到的大多數(shù)例子都是在Spring容器中進行的配置。
使用Spring Framework構(gòu)建你的O/R Mapping DAO的好處包括:
便于測試。 Spring的IoC方式使得替換不同的實現(xiàn)和配置變得非常簡單,
這些內(nèi)容包括:Hibernate SessionFactory
實例的位置,JDBC DataSource
實例,事務(wù)管理器以及映射對象的實現(xiàn)(如果需要)等。這樣也就很容易隔離并測試持久化相關(guān)的代碼的各個部分。
通用數(shù)據(jù)訪問異常封裝。 Spring能夠封裝你所選擇的O/R Mapping工具所拋出的異常, 將它們從專有的(潛在的checked)異常轉(zhuǎn)化為一組抽象的runtime DataAccessException體系。 這可以使你僅需要在恰當?shù)膽?yīng)用程序?qū)哟稳ヌ幚泶蟛糠植豢苫謴?fù)的持久層異常,從而避免了很多令人討厭的catch/throw以及異常聲明。 當然,你還是可以在你需要的地方捕捉和處理異常?;叵胍幌翵DBC異常(包括與DB相關(guān)的Dialect)被轉(zhuǎn)變?yōu)橥瑯拥漠惓sw系,這就意味著你可以在一致的編程模型中處理JDBC操作。
通用的資源管理。 Spring的application context能夠處理諸如Hibernate的 SessionFactory
實例,
JDBC的 DataSource
實例,iBATIS的SQL Maps配置對象以及其他相關(guān)資源的定位和配置。
這樣,這些配置的值很容易被管理和修改。Spring提供了簡單、高效、安全的對持久層資源的處理。
以Hibernate為例,通常在使用Hibernate時,需要使用同一個Hibernate Session
實例以確保高效和恰當?shù)厥聞?wù)處理。
Spring讓我們能夠很容易透明地創(chuàng)建并綁定一個 Session
到當前線程。
你可以使用以下兩種辦法之一:通過使用一個外部的template包裝類在Java代碼層次實現(xiàn),
或者通過Hibernate的 SessionFactory
暴露當前 Session
對象(對于那些建立在Hibernate原生的API上的DAO)。
這樣,對于任何的事務(wù)環(huán)境(本地事務(wù)或者JTA),Spring解決了許多在典型Hibernate使用中不斷出現(xiàn)的這樣那樣的問題。
完整的事務(wù)管理。 Spring允許你封裝你的O/R Mapping代碼, 這可以通過聲明式的AOP方法攔截器或者在Java代碼級別上使用一個外部的template包裝類。 無論使用哪一種方式,事務(wù)控制都會幫助你做相關(guān)處理,例如一旦有異常發(fā)生時的事務(wù)操作(rollback等)。 正如我們下面要討論的一樣,你能夠使用和替換各種事務(wù)管理器,卻不會使你的Hibernate/JDO相關(guān)的代碼受到影響。 例如,不管采用本地事務(wù)還是JTA,完整的Service層的代碼(如聲明式事務(wù)管理)在這種場景下都是相同的。 作為一個附加的功能,JDBC相關(guān)的代碼能夠在事務(wù)級別上與你所使用的O/R映射代碼無縫整合。 這一功能對于那些諸如批量處理、BLOB的操作等并不適合采用O/R Mapping操作的,但是需要與ORM操作一起參與相同的事務(wù)來說是相當有用的。
在Spring發(fā)布包中的PetClinic提供了各種可選擇的DAO實現(xiàn)和application context對JDBC、Hibernate、Oracle TopLink和JPA的配置。 因而PetClinic能夠作為一個Spring的web應(yīng)用示例程序來描述Hibernate、TopLink和JPA的使用方法的。它同時涵蓋了聲明式事務(wù)中不同事務(wù)策略的配置。
JPetStore示例主要舉例說明了iBATIS SQL Maps在Spring環(huán)境中的使用。它同時包含了兩套不同的Web層選擇,一套基于Spring Web MVC,而另外一套則基于Struts。
除了Spring自身提供的示例之外,有很多其他的基于Spring的O/R Mapping的示例,他們由各自的供應(yīng)商提供。 例如:JDO的JPOX實現(xiàn)(http://www.jpox.org/)以及Kodo(http://www.bea.com/kodo)。