Spring ORM 簡介

Spring Framework 支援與 Java Persistence API (JPA) 整合,並支援原生的 Hibernate 用於資源管理、資料訪問物件 (DAO) 實現和事務策略。例如,對於 Hibernate,它提供一流的支援以及若干便利的 IoC 特性,這些特性解決了許多典型的 Hibernate 整合問題。你可以透過依賴注入配置所有支援的 OR (物件關係) 對映工具的功能。它們可以參與 Spring 的資源和事務管理,並且它們符合 Spring 的通用事務和 DAO 異常層次結構。推薦的整合方式是根據純粹的 Hibernate 或 JPA API 編寫 DAO。

當你建立資料訪問應用時,Spring 為你選擇的 ORM 層添加了顯著增強。你可以根據需要利用盡可能多的整合支援,並且你應該將這種整合工作與內部構建類似基礎設施的成本和風險進行比較。你可以像使用庫一樣使用大部分 ORM 支援,無論技術如何,因為所有東西都被設計為一組可重用的 JavaBean。Spring IoC 容器中的 ORM 有助於配置和部署。因此,本節中的大多數示例都展示了 Spring 容器內的配置。

使用 Spring Framework 建立 ORM DAO 的好處包括:

  • 更容易測試。 Spring 的 IoC 方法使得輕鬆切換 Hibernate SessionFactory 例項、JDBC DataSource 例項、事務管理器和對映物件實現的實現及配置位置變得容易(如果需要)。這反過來又使得更容易隔離地測試持久化相關的程式碼片段。

  • 統一的資料訪問異常。 Spring 可以包裝你的 ORM 工具丟擲的異常,將它們從專有的(可能是受檢的)異常轉換為通用的執行時 DataAccessException 層次結構。此功能使你能夠在適當的層中處理大多數持久化異常(這些異常是不可恢復的),而無需煩人的樣板式 catch、throws 和異常宣告。你仍然可以在必要時捕獲和處理異常。請記住,JDBC 異常(包括特定於資料庫的方言)也被轉換為相同的層次結構,這意味著你可以在一致的程式設計模型中執行一些 JDBC 操作。

  • 通用的資源管理。 Spring 應用上下文可以處理 Hibernate SessionFactory 例項、JPA EntityManagerFactory 例項、JDBC DataSource 例項和其他相關資源的位置和配置。這使得這些值的管理和更改變得容易。Spring 提供高效、簡單和安全的持久化資源處理。例如,使用 Hibernate 的相關程式碼通常需要使用相同的 Hibernate Session 來確保效率和正確的事務處理。Spring 透過 Hibernate SessionFactory 透明地暴露一個當前 Session,使得建立和繫結 Session 到當前執行緒變得容易。因此,對於任何本地或 JTA 事務環境,Spring 解決了許多典型 Hibernate 使用中的長期存在的問題。

  • 整合的事務管理。 你可以使用宣告式的面向切面程式設計 (AOP) 風格方法攔截器包裝你的 ORM 程式碼,可以透過 @Transactional 註解或透過在 XML 配置檔案中顯式配置事務 AOP advice。在這兩種情況下,事務語義和異常處理(回滾等)都為你處理。正如 資源和事務管理 中討論的,你還可以切換各種事務管理器,而不會影響你的 ORM 相關程式碼。例如,你可以在本地事務和 JTA 之間切換,在這兩種場景中都可使用相同的完整服務(例如宣告式事務)。此外,JDBC 相關程式碼可以與你用於 ORM 的程式碼在事務上完全整合。這對於不適合 ORM 的資料訪問(例如批次處理和 BLOB 流處理)很有用,這些資料訪問仍然需要與 ORM 操作共享公共事務。

為了獲得更全面的 ORM 支援,包括對 MongoDB 等其他資料庫技術的支援,你可能需要檢視 Spring Data 專案套件。如果你是 JPA 使用者,spring.io 上的 開始使用 JPA 訪問資料 指南提供了一個很好的入門介紹。