通用 ORM 整合考慮事項
本節重點介紹適用於所有 ORM 技術的注意事項。Hibernate 部分提供了更多細節,並展示了這些功能和配置在一個具體上下文中的應用。
Spring ORM 整合的主要目標是實現清晰的應用程式分層(使用任何資料訪問和事務技術)以及應用程式物件的鬆散耦合——業務服務不再依賴於資料訪問或事務策略,不再有硬編碼的資源查詢,不再有難以替換的單例,不再有自定義服務登錄檔。目標是採用一種簡單一致的方法來連線應用程式物件,使它們儘可能可重用且不依賴於容器。所有獨立的資料訪問功能都可以單獨使用,但與 Spring 的應用程式上下文概念完美整合,提供基於 XML 的配置以及對無需 Spring 感知的普通 JavaBean 例項的交叉引用。在典型的 Spring 應用程式中,許多重要的物件都是 JavaBean:資料訪問模板、資料訪問物件、事務管理器、使用資料訪問物件和事務管理器的業務服務、Web 檢視解析器、使用業務服務的 Web 控制器等等。
資源和事務管理
典型的業務應用程式中充斥著重複的資源管理程式碼。許多專案試圖發明自己的解決方案,有時為了程式設計方便而犧牲了對失敗的正確處理。Spring 提倡採用簡單的解決方案來正確處理資源,即在 JDBC 中透過模板進行 IoC,並在 ORM 技術中應用 AOP 攔截器。
基礎設施提供適當的資源處理和將特定 API 異常適當轉換為非受檢的基礎設施異常層次結構。Spring 引入了一個 DAO 異常層次結構,適用於任何資料訪問策略。對於直接 JDBC,上一節中提到的 JdbcTemplate 類提供連線處理並將 SQLException 正確轉換為 DataAccessException 層次結構,包括將特定於資料庫的 SQL 錯誤程式碼轉換為有意義的異常類。對於 ORM 技術,請參閱下一節,瞭解如何獲得相同的異常轉換優勢。
在事務管理方面,JdbcTemplate 類與 Spring 事務支援整合,並透過各自的 Spring 事務管理器支援 JTA 和 JDBC 事務。對於受支援的 ORM 技術,Spring 透過 Hibernate 和 JPA 事務管理器以及 JTA 支援提供 Hibernate 和 JPA 支援。有關事務支援的詳細資訊,請參閱事務管理章節。
異常轉換
當您在 DAO 中使用 Hibernate 或 JPA 時,您必須決定如何處理持久化技術的原生異常類。DAO 會根據技術丟擲 HibernateException 或 PersistenceException 的子類。這些異常都是執行時異常,無需宣告或捕獲。您可能還需要處理 IllegalArgumentException 和 IllegalStateException。這意味著呼叫者只能將異常視為一般性致命錯誤,除非他們希望依賴於持久化技術自身的異常結構。如果不將呼叫者繫結到實現策略,就無法捕獲特定原因(例如樂觀鎖定失敗)。這種權衡對於強烈依賴 ORM 或不需要任何特殊異常處理(或兩者兼有)的應用程式來說可能是可以接受的。然而,Spring 允許透過 @Repository 註解透明地應用異常轉換。以下示例(一個用於 Java 配置,一個用於 XML 配置)展示瞭如何做到這一點。
-
Java
-
Kotlin
@Repository
public class ProductDaoImpl implements ProductDao {
// class body here...
}
@Repository
class ProductDaoImpl : ProductDao {
// class body here...
}
<beans>
<!-- Exception translation bean post processor -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="myProductDao" class="product.ProductDaoImpl"/>
</beans>
後處理器會自動查詢所有異常轉換器(PersistenceExceptionTranslator 介面的實現),並通知所有帶有 @Repository 註解的 bean,以便發現的轉換器可以攔截並對丟擲的異常應用適當的轉換。
總而言之,您可以基於純粹的持久化技術 API 和註解實現 DAO,同時仍然受益於 Spring 管理的事務、依賴注入和透明的異常轉換(如果需要)到 Spring 的自定義異常層次結構。