通用 ORM 整合考量

本節重點介紹適用於所有 ORM 技術的考量因素。Hibernate 一節提供了更多詳細資訊,並展示了這些特性和配置的具體上下文。

Spring ORM 整合的主要目標是清晰的應用分層(適用於任何資料訪問和事務技術),以及應用物件的松耦合——不再需要業務服務依賴於資料訪問或事務策略,不再需要硬編碼的資源查詢,不再需要難以替換的單例,不再需要自定義服務登錄檔。目標是採用一種簡單且一致的方法來連線應用物件,使其儘可能地可重用並獨立於容器依賴。所有獨立的資料訪問特性都可以單獨使用,但也與 Spring 的應用上下文概念很好地整合,提供基於 XML 的配置和對無需 Spring 感知的普通 JavaBean 例項的交叉引用。在典型的 Spring 應用中,許多重要的物件都是 JavaBean:資料訪問模板、資料訪問物件、事務管理器、使用資料訪問物件和事務管理器的業務服務、web 檢視解析器、使用業務服務的 web 控制器等等。

資源和事務管理

典型的業務應用中充斥著重複的資源管理程式碼。許多專案試圖發明自己的解決方案,有時為了程式設計便利而犧牲了對故障的正確處理。Spring 提倡採用簡單的解決方案來正確處理資源,即在 JDBC 的情況下透過模板使用 IoC,以及對 ORM 技術應用 AOP 攔截器。

基礎設施提供適當的資源處理,並將特定的 API 異常適當轉換為非受檢的基礎設施異常層次結構。Spring 引入了 DAO 異常層次結構,適用於任何資料訪問策略。對於直接 JDBC,前一節中提到的 JdbcTemplate 類接入 Spring 事務支援,透過各自的 Spring 事務管理器支援 JTA 和 JDBC 事務。對於支援的 ORM 技術,Spring 透過 Hibernate 和 JPA 事務管理器以及 JTA 支援提供 Hibernate 和 JPA 支援。有關事務支援的詳細資訊,請參閱事務管理一章。

When it comes to transaction management, the JdbcTemplate class hooks in to the Spring transaction support and supports both JTA and JDBC transactions, through respective Spring transaction managers. For the supported ORM technologies, Spring offers Hibernate and JPA support through the Hibernate and JPA transaction managers as well as JTA support. For details on transaction support, see the Transaction Management chapter.

異常轉換

在 DAO 中使用 Hibernate 或 JPA 時,必須決定如何處理持久化技術的原生異常類。DAO 會根據使用的技術丟擲 HibernateExceptionPersistenceException 的子類。這些異常都是執行時異常,無需宣告或捕獲。您可能還需要處理 IllegalArgumentExceptionIllegalStateException。這意味著呼叫者只能將異常視為通常是致命的,除非他們想依賴於持久化技術自身的異常結構。在不將呼叫者繫結到實現策略的情況下,無法捕獲特定的原因(例如樂觀鎖失敗)。對於高度依賴 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 自定義異常層次結構的透明異常轉換。