跳到主要内容

DAO 支持

ChatGPT-4o-mini 中英对照 DAO Support

Spring 中的数据访问对象 (DAO) 支持旨在以一致的方式简化与数据访问技术(如 JDBC、Hibernate 或 JPA)的工作。这使您能够相对轻松地在上述持久性技术之间切换,并且还可以让您在编码时无需担心捕获特定于每种技术的异常。

一致的异常层次结构

Spring 提供了一种方便的转换,将特定于技术的异常,例如 SQLException,转换为其自己的异常类层次结构,其中 DataAccessException 是根异常。这些异常包装了原始异常,因此您永远不必担心会丢失关于可能出现问题的信息。

除了 JDBC 异常,Spring 还可以包装 JPA 和 Hibernate 特定的异常,将它们转换为一组专注的运行时异常。这使您能够仅在适当的层中处理大多数不可恢复的持久性异常,而无需在您的 DAO 中编写烦人的样板捕获和抛出块以及异常声明。(不过,您仍然可以在需要的地方捕获和处理异常。)如上所述,JDBC 异常(包括数据库特定的方言)也会转换为相同的层次结构,这意味着您可以在一致的编程模型中执行一些 JDBC 操作。

前面的讨论适用于 Spring 对各种 ORM 框架支持的各种模板类。如果使用基于拦截器的类,应用程序必须自己处理 HibernateExceptionsPersistenceExceptions,最好是分别委托给 SessionFactoryUtilsconvertHibernateAccessException(..)convertJpaAccessException(..) 方法。这些方法将异常转换为与 org.springframework.dao 异常层次结构中的异常兼容的异常。由于 PersistenceExceptions 是未检查异常,它们也可以被抛出(尽管这牺牲了在异常方面的通用 DAO 抽象)。

下图显示了 Spring 提供的异常层次结构。 (请注意,图中详细列出的类层次结构仅显示了整个 DataAccessException 层次结构的一个子集。)

DataAccessException

用于配置 DAO 或 Repository 类的注解

保证您的数据访问对象 (DAOs) 或存储库提供异常翻译的最佳方法是使用 @Repository 注解。该注解还允许组件扫描支持找到并配置您的 DAOs 和存储库,而无需为它们提供 XML 配置条目。以下示例展示了如何使用 @Repository 注解:

@Repository 1
public class SomeMovieFinder implements MovieFinder {
// ...
}
java
  • @Repository 注解。

任何 DAO 或存储库实现都需要访问持久性资源,这取决于所使用的持久性技术。例如,基于 JDBC 的存储库需要访问一个 JDBC DataSource,而基于 JPA 的存储库需要访问一个 EntityManager。实现这一点的最简单方法是通过使用 @Autowired@Inject@Resource@PersistenceContext 注解来注入这个资源依赖。以下示例适用于 JPA 存储库:

@Repository
public class JpaMovieFinder implements MovieFinder {

@PersistenceContext
private EntityManager entityManager;

// ...
}
java

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

@Repository
public class HibernateMovieFinder implements MovieFinder {

private SessionFactory sessionFactory;

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

// ...
}
java

最后一个示例是针对典型的 JDBC 支持。您可以将 DataSource 注入到初始化方法或构造函数中,在那里您可以使用这个 DataSource 创建 JdbcTemplate 和其他数据访问支持类(例如 SimpleJdbcCall 等)。以下示例自动装配了一个 DataSource

@Repository
public class JdbcMovieFinder implements MovieFinder {

private JdbcTemplate jdbcTemplate;

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

// ...
}
java
备注

有关如何配置应用程序上下文以利用这些注释的详细信息,请参见每种持久性技术的具体覆盖范围。