DAO 支援

Spring 中的資料訪問物件 (DAO) 支援旨在讓您能夠以一致的方式輕鬆使用資料訪問技術(例如 JDBC、Hibernate 或 JPA)。這使您可以在前面提到的持久化技術之間相當容易地切換,並且還使您無需擔心捕獲特定於每種技術的異常即可編寫程式碼。

一致的異常層次結構

Spring 提供了一種方便的轉換,可以將特定於技術的異常(例如 SQLException)轉換為其自己的異常類層次結構,其中 DataAccessException 是根異常。這些異常會包裝原始異常,因此您永遠不會丟失任何關於可能出錯的資訊。

除了 JDBC 異常,Spring 還可以包裝 JPA 和 Hibernate 特定的異常,並將它們轉換為一組集中的執行時異常。這使您可以在僅適當的層中處理大多數不可恢復的永續性異常,而無需在 DAO 中出現煩人的樣板 catch-and-throw 塊和異常宣告。(不過,您仍然可以在任何需要的地方捕獲和處理異常。)如上所述,JDBC 異常(包括資料庫特定方言)也會轉換為相同的層次結構,這意味著您可以在一致的程式設計模型中執行某些 JDBC 操作。

上述討論適用於 Spring 支援各種 ORM 框架的各種模板類。如果您使用基於攔截器的類,應用程式必須自行處理 HibernateExceptionsPersistenceExceptions,最好是透過分別委託給 SessionFactoryUtilsconvertHibernateAccessException(..)convertJpaAccessException(..) 方法。這些方法將異常轉換為與 org.springframework.dao 異常層次結構中的異常相容的異常。由於 PersistenceExceptions 是未檢查的,它們也可以被丟擲(儘管犧牲了異常方面的通用 DAO 抽象)。

下圖顯示了 Spring 提供的異常層次結構。(請注意,圖中詳細的類層次結構僅顯示了整個 DataAccessException 層次結構的一個子集。)

DataAccessException

用於配置 DAO 或儲存庫類的註解

確保您的資料訪問物件 (DAO) 或儲存庫提供異常轉換的最佳方法是使用 @Repository 註解。此註解還允許元件掃描支援查詢和配置您的 DAO 和儲存庫,而無需為其提供 XML 配置條目。以下示例演示瞭如何使用 @Repository 註解

  • Java

  • Kotlin

@Repository (1)
public class SomeMovieFinder implements MovieFinder {
	// ...
}
1 @Repository 註解。
@Repository (1)
class SomeMovieFinder : MovieFinder {
	// ...
}
1 @Repository 註解。

任何 DAO 或儲存庫實現都需要訪問持久化資源,具體取決於所使用的持久化技術。例如,基於 JDBC 的儲存庫需要訪問 JDBC DataSource,而基於 JPA 的儲存庫需要訪問 EntityManager。實現這一點的最簡單方法是使用 @Autowired@Inject@Resource@PersistenceContext 註解之一注入此資源依賴項。以下示例適用於 JPA 儲存庫

  • Java

  • Kotlin

@Repository
public class JpaMovieFinder implements MovieFinder {

	@PersistenceContext
	private EntityManager entityManager;

	// ...
}
@Repository
class JpaMovieFinder : MovieFinder {

	@PersistenceContext
	private lateinit var entityManager: EntityManager

	// ...
}

如果您使用經典的 Hibernate API,您可以注入 SessionFactory,如下例所示

  • Java

  • Kotlin

@Repository
public class HibernateMovieFinder implements MovieFinder {

	private SessionFactory sessionFactory;

	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	// ...
}
@Repository
class HibernateMovieFinder(private val sessionFactory: SessionFactory) : MovieFinder {
	// ...
}

我們在此處展示的最後一個示例是針對典型的 JDBC 支援。您可以將 DataSource 注入初始化方法或建構函式中,在那裡您可以使用此 DataSource 建立 JdbcTemplate 和其他資料訪問支援類(例如 SimpleJdbcCall 等)。以下示例自動裝配 DataSource

  • Java

  • Kotlin

@Repository
public class JdbcMovieFinder implements MovieFinder {

	private JdbcTemplate jdbcTemplate;

	@Autowired
	public void init(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	// ...
}
@Repository
class JdbcMovieFinder(dataSource: DataSource) : MovieFinder {

	private val jdbcTemplate = JdbcTemplate(dataSource)

	// ...
}
有關如何配置應用程式上下文以利用這些註解的詳細資訊,請參閱每種持久化技術的具體介紹。
© . This site is unofficial and not affiliated with VMware.