18. DAO support

18.1 Introduction

Spring 对数据访问对象(DAO)的支持旨在使以一致的方式轻松使用诸如 JDBC,Hibernate,JPA 或 JDO 之类的数据访问技术。这允许人们相当容易地在上述持久性技术之间进行切换,并且还允许人们进行编码而不必担心捕获每种技术特有的异常。

18.2 一致的异常层次结构

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

除了 JDBC 异常,Spring 还可以包装特定于 Hibernate 的异常,将它们转换为一组集中的运行时异常(JDO 和 JPA 异常也是如此)。这样一来,人们就只能在适当的层中处理大多数不可恢复的持久性异常,而不必在一个人的 DAO 中使用烦人的样板捕捉和抛出块以及异常声明。 (仍然可以在任何需要的地方捕获和处理异常.)如上所述,JDBC 异常(包括特定于数据库的方言)也被转换为同一层次结构,这意味着人们可以在一致的编程模型中对 JDBC 执行某些操作。 。

对于 Springs 对各种 ORM 框架的支持中的各种模板类,以上内容均适用。如果使用基于拦截器的类,那么应用程序必须关心处理HibernateExceptionsJDOExceptions本身,最好分别委派给_ SessionFactoryUtils'convertHibernateAccessException(..)convertJdoAccessException()方法。这些方法将异常转换为与org.springframework.dao异常层次结构中的异常兼容的异常。由于未选中JDOExceptions`,它们也可以被抛出,但是就异常而言牺牲了通用 DAO 抽象。

Spring 提供的异常层次结构可以在下面看到。 (请注意,图像中详细说明的类层次结构仅显示整个DataAccessException层次结构的子集.)

DataAccessException

18.3 用于配置 DAO 或存储库类的 Comments

确保您的数据访问对象(DAO)或存储库提供异常翻译的最佳方法是使用@Repository注解。此 Comments 还允许组件扫描支持查找和配置您的 DAO 和存储库,而不必为其提供 XML 配置条目。

@Repository
public class SomeMovieFinder implements MovieFinder {
    // ...
}

任何 DAO 或存储库实现都将需要访问持久性资源,具体取决于所使用的持久性技术;例如,基于 JDBC 的存储库将需要访问 JDBC DataSource;基于 JPA 的存储库将需要访问EntityManager。完成此操作的最简单方法是使用@Autowired,@Inject@Resource@PersistenceContext注解之一注入此资源依赖项。这是一个 JPA 存储库的示例:

@Repository
public class JpaMovieFinder implements MovieFinder {

    @PersistenceContext
    private EntityManager entityManager;

    // ...

}

如果使用经典的 Hibernate API,则可以注入 SessionFactory:

@Repository
public class HibernateMovieFinder implements MovieFinder {

    private SessionFactory sessionFactory;

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

    // ...

}

我们将在此处显示的最后一个示例是典型的 JDBC 支持。您将DataSource注入到初始化方法中,在该方法中,您将使用DataSource创建JdbcTemplate和其他数据访问支持类,例如SimpleJdbcCall等。

@Repository
public class JdbcMovieFinder implements MovieFinder {

    private JdbcTemplate jdbcTemplate;

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

    // ...

}

Note

有关如何配置应用程序上下文以利用这些 Comments 的详细信息,请参见每种持久性技术的特定介绍。