Spring 中的数据访问对象 (DAO) 支持旨在使其易于使用 以一致的方式访问数据技术(例如 JDBC、Hibernate 或 JPA)。这 让您在上述持久性技术之间轻松切换, 它还允许您编写代码,而不必担心捕获异常 特定于每种技术。Spring中文文档

一致的异常层次结构

Spring 提供了从特定于技术的异常的便捷转换,例如到它自己的异常类层次结构,该层次结构具有 根异常。这些异常包装了原始异常,因此永远不会有 您可能会丢失有关可能出错的任何信息的任何风险。SQLExceptionDataAccessExceptionSpring中文文档

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

前面的讨论适用于 Spring 支持中的各种模板类 适用于各种 ORM 框架。如果使用基于侦听器的类,则应用程序必须 关心处理和本身,最好是 分别委托给 的 或 方法。这些方法转换异常 到与异常层次结构中的例外兼容的例外。如果不加以检查,它们也可能被扔掉 (不过,在例外方面牺牲了通用 DAO 抽象)。HibernateExceptionsPersistenceExceptionsconvertHibernateAccessException(..)convertJpaAccessException(..)SessionFactoryUtilsorg.springframework.daoPersistenceExceptionsSpring中文文档

下图显示了 Spring 提供的异常层次结构。 (请注意,图中详述的类层次结构仅显示整个层次结构的子集。DataAccessExceptionSpring中文文档

数据访问异常

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

保证数据访问对象 (DAO) 或存储库提供 例外翻译是使用注释。此注释还 让组件扫描支持查找和配置您的 DAO 和存储库 而不必为它们提供 XML 配置条目。以下示例显示 如何使用注释:@Repository@RepositorySpring中文文档

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

任何 DAO 或存储库实现都需要访问持久性资源, 取决于所使用的持久性技术。例如,基于 JDBC 的存储库 需要访问 JDBC ,而基于 JPA 的存储库需要访问 .实现此目的的最简单方法是具有此资源依赖关系 通过使用 、 或 注释之一注入。以下示例适用于 JPA 存储库:DataSourceEntityManager@Autowired@Inject@Resource@PersistenceContextSpring中文文档

@Repository
public class JpaMovieFinder implements MovieFinder {

	@PersistenceContext
	private EntityManager entityManager;

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

	@PersistenceContext
	private lateinit var entityManager: EntityManager

	// ...
}

如果使用经典的 Hibernate API,则可以注入 ,如下所示 示例显示:SessionFactorySpring中文文档

@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 支持。您可以将其注入初始化方法或构造函数中,您可以在其中使用 this 创建和其他数据访问支持类(例如和其他类)。以下示例自动接线:DataSourceJdbcTemplateSimpleJdbcCallDataSourceDataSourceSpring中文文档

@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)

	// ...
}
有关如何 配置应用程序上下文以利用这些批注。
1 注释。@Repository
1 注释。@Repository
有关如何 配置应用程序上下文以利用这些批注。