Spring ORM數據訪問——概述

介紹一下Spring中的ORM

Spring框架在實現資源管理、數據訪問對象(DAO)層,和事務策略等方面,支持對Java持久化API(JPA)以及原生Hibernate的集成。以Hibernate舉例來說,Spring有非常讚的IoC功能,可以解決許多典型的Hibernate配置和集成問題。開發者可以通過依賴注入來配置O-R(對象關係)映射組件支持的特性。Hibernate的這些特性可以參與Spring的資源和事務管理,並且符合Spring的通用事務和DAO層的異常體系。因此,Spring團隊推薦開發者使用Spring集成的方式來開發DAO層,而不是使用原生的Hibernate或者JPA的API。老版本的Spring DAO模板現在不推薦使用了,想了解這部分內容可以參考經典ORM使用一節。

當開發者創建數據訪問應用程序時,Spring會爲開發者選擇的ORM層對應功能進行優化。而且,開發者可以根據需要來利用Spring對集成ORM的支持,開發者應該將此集成工作與維護內部類似的基礎架構服務的成本和風險進行權衡。同時,開發者在使用Spring集成的時候可以很大程度上不用考慮技術,將ORM的支持當做一個庫來使用,因爲所有的組件都被設計爲可重用的JavaBean組件了。Spring IoC容器中的ORM十分易於配置和部署。本節中的大多數示例都是講解在Spring容器中的來如何配置。

開發者使用Spring框架來中創建自己的ORM DAO的好處如下:

  • 易於測試。Spring IoC的模式使得開發者可以輕易的替換Hibernate的SessionFactory實例,JDBC的DataSource
    實例,事務管理器,以及映射對象(如果有必要)的配置和實現。這一特點十分利於開發者對每個模塊進行獨立的測試。
  • 泛化數據訪問異常。Spring可以將ORM工具的異常封裝起來,將所有異常(可以是受檢異常)封裝成運行時的DataAccessException體系。這一特性可以令開發者在合適的邏輯層上處理絕大多數不可修復的持久化異常,避免了大量的catch,throw和異常的聲明。開發者還可以按需來處理這些異常。其中,JDBC異常(包括一些特定DB語言)都會被封裝爲相同的體系,意味着開發者即使使用不同的JDBC操作,基於不同的DB,也可以保證一致的編程模型。
  • 通用的資源管理。Spring的應用上下文可以通過處理配置源的位置來靈活配置Hibernate的SessionFactory實例,JPA的EntityManagerFactory實例,JDBC的DataSource實例以及其他類似的資源。Spring的這一特性使得這些實例的配置十分易於管理和修改。同時,Spring還爲處理持久化資源的配置提供了高效,易用和安全的處理方式。舉個例子,有些代碼使用了Hibernate需要使用相同的Session來確保高效性和正確的事務處理。Spring通過Hibernate的SessionFactory來獲取當前的Session,來透明的將Session綁定到當前的線程。Srping爲任何本地或者JTA事務環境解決了在使用Hibernate時碰到的一些常見問題。
  • 集成事務管理。開發者可以通過@Transactional註解或在XML配置文件中顯式配置事務AOP Advise攔截,將ORM代碼封裝在聲明式的AOP方法攔截器中。事務的語義和異常處理(回滾等)都可以根據開發者自己的需求來定製。在後面的章節中,資源和事務管理中,開發者可以在不影響ORM相關代碼的情況下替換使用不同的事務管理器。例如,開發者可以在本地事務和JTA之間進行交換,並在兩種情況下具有相同的完整服務(如聲明式事務)。而且,JDBC相關的代碼在事務上完全和處理ORM部分的代碼集成。這對於不適用於ORM的數據訪問非常有用,例如批處理和BLOB流式傳輸,仍然需要與ORM操作共享常見事務。

爲了更全面的ORM支持,包括支持其他類型的數據庫技術(如MongoDB),開發者可能需要查看Spring Data系列項目。如果開發者是JPA用戶,則可以從https://spring.io的查閱開始使用JPA訪問數據指南一文進行簡單瞭解。

集成ORM的注意事項

本節重點介紹適用於所有集成ORM技術的注意事項。在16.3Hibernate一節中提供了很多關於如何配置和使用這些特性提的信息。

Spring對ORM集成的主要目的是使應用層次化,可以任意選擇數據訪問和事務管理技術,並且爲應用對象提供鬆耦合結構。不再將業務邏輯依賴於數據訪問或者事務策略上,不再使用基於硬編碼的資源查找,不再使用難以替代的單例,不再自定義服務的註冊。同時,爲應用提供一個簡單和一致的方法來裝載對象,保證他們的重用並且儘可能不依賴於容器。所有單獨的數據訪問功能都可以自己使用,也可以很好地與Spring的ApplicationContext集成,提供基於XML的配置和不需要Spring感知的普通JavaBean實例。在典型的Spring應用程序中,許多重要的對象都是JavaBean:數據訪問模板,數據訪問對象,事務管理器,使用數據訪問對象和事務管理器的業務服務,Web視圖解析器,使用業務服務的Web控制器等等。

資源和事務管理

通常企業應用都會包含很多重複的的資源管理代碼。很多項目總是嘗試去創造自己的解決方案,有時會爲了開發的方便而犧牲對錯誤的處理。Spring爲資源的配置管理提供了簡單易用的解決方案,在JDBC上使用模板技術,在ORM上使用AOP攔截技術。

Spring的基礎設施提供了合適的資源處理,同時Spring引入了DAO層的異常體系,可以適用於任何數據訪問策略。對於JDBC直連來說,前面提及到的JdbcTemplate類提供了包括連接處理,對SQLExceptionDataAccessException的異常封裝,同時還包含對於一些特定數據庫SQL錯誤代碼的轉換。對於ORM技術來說,可以參考下一節來了解異常封裝的優點。

當談到事務管理時,JdbcTemplate類通過Spring事務管理器掛接到Spring事務支持,並支持JTA和JDBC事務。Spring通過Hibernate,JPA事務管理器和JTA的支持來提供Hibernate和JPA這類ORM技術的支持。想了解更多關於事務的描述,可以參考第13章,事務管理

異常轉義

當在DAO層中使用Hibernate或者JPA的時候,開發者必須決定該如何處理持久化技術的一些原生異常。DAO層會根據選擇技術的不同而拋出HibernateException或者PersistenceException。這些異常都屬於運行時異常,所以無需顯式聲明和捕捉。同時,開發者同時還需要處理IllegalArgumentExceptionIllegalStateException這類異常。一般情況下,調用方通常只能將這一類異常視爲致命的異常,除非他們想要自己的應用依賴於持久性技術原生的異常體系。如果需要捕獲一些特定的錯誤,比如樂觀鎖獲取失敗一類的錯誤,只能選擇調用方和實現策略耦合到一起。對於那些只基於某種特定ORM技術或者不需要特殊異常處理的應用來說,使用ORM本身的異常體系的代價是可以接受的。但是,Spring可以通過@Repository註解透明地應用異常轉換,以解耦調用方和ORM技術的耦合:

@Repository
public class ProductDaoImpl implements ProductDao {

    // class body here...

}
<beans>

    <!-- Exception translation bean post processor -->
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

    <bean id="myProductDao" class="product.ProductDaoImpl"/>

</beans>

上面的後置處理器PersistenceExceptionTranslationPostProcessor,會自動查找所有的異常轉義器(實現PersistenceExceptionTranslator接口的Bean),並且攔截所有標記爲@Repository註解的Bean,通過代理來攔截異常,然後通過PersistenceExceptionTranslator將DAO層異常轉義後的異常拋出。

總而言之:開發者可以既基於簡單的持久化技術的API和註解來實現DAO,同時還受益於Spring管理的事務,依賴注入和透明異常轉換(如果需要)到Spring的自定義異常層次結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章