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 框架的支持中的各种模板类,以上内容均适用。如果使用基于拦截器的类,那么应用程序必须关心处理HibernateExceptions
和JDOExceptions
本身,最好分别委派给_ SessionFactoryUtils'
convertHibernateAccessException(..)或
convertJdoAccessException()方法。这些方法将异常转换为与
org.springframework.dao异常层次结构中的异常兼容的异常。由于未选中
JDOExceptions`,它们也可以被抛出,但是就异常而言牺牲了通用 DAO 抽象。
Spring 提供的异常层次结构可以在下面看到。 (请注意,图像中详细说明的类层次结构仅显示整个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 的详细信息,请参见每种持久性技术的特定介绍。