DAO 支持

数据访问对象(DAO)支持在 Infra 中旨在以一种一致的方式简化与数据访问技术(如 JDBC、Hibernate 或 JPA)的工作。 这使您能够在这些持久化技术之间相对容易地切换,并且让您在编码时不必担心捕获每种技术特有的异常。

一致的异常层次结构

Infra 提供了一种方便的技术特定异常(如 SQLException)到其自己的异常类层次结构的转换, 以 DataAccessException 作为根异常。这些异常包装了原始异常,因此永远不会有丢失有关可能出错信息的风险。

除了 JDBC 异常外,Infra 还可以包装 JPA 和 Hibernate 特定异常,将它们转换为一组集中的运行时异常。 这使您只需在适当的层处理大多数不可恢复的持久性异常,而无需在您的 DAO 中有烦人的样板 catch-and-throw 块和异常声明。 (您仍然可以在需要的任何地方捕获和处理异常。)如上所述,JDBC 异常(包括特定于数据库的方言)也转换为相同的层次结构,这意味着您可以在一致的编程模型内使用 JDBC 执行一些操作。

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

下图显示了 Infra 提供的异常层次结构。 (注意,图中详细说明的类层次结构只显示了整个 DataAccessException 层次结构的一个子集。)

DataAccessException

用于配置 DAO 或存储库类的注解

确保您的数据访问对象(DAO)或存储库提供异常转换的最佳方法是使用 @Repository 注解。 此注解还允许组件扫描支持在不需要为它们提供 XML 配置条目的情况下找到并配置您的 DAO 和存储库。以下示例展示了如何使用 @Repository 注解:

  • Java

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

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

  • Java

@Repository
public class JpaMovieFinder implements MovieFinder {

  @PersistenceContext
  private EntityManager entityManager;

  // ...
}

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

  • Java

@Repository
public class HibernateMovieFinder implements MovieFinder {

  private SessionFactory sessionFactory;

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

  // ...
}

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

  • Java

@Repository
public class JdbcMovieFinder implements MovieFinder {

  private JdbcTemplate jdbcTemplate;

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

  // ...
}

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