此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

DAO 支持

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

一致的异常层次结构

Spring 提供了特定于技术的例外的便捷翻译,例如SQLException到它自己的异常类层次结构,该层次结构具有DataAccessException如 根异常。这些异常包装原始异常,因此永远不会任何风险,您可能会丢失有关可能出错的任何信息。spring-doc.cadn.net.cn

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

前面的讨论适用于 Spring 支持的各种模板类对于各种 ORM 框架。如果您使用基于拦截器的类,应用程序必须关心处理HibernateExceptionsPersistenceExceptions本身,最好是通过委托给convertHibernateAccessException(..)convertJpaAccessException(..)方法,分别SessionFactoryUtils. 这些方法将异常转换为与org.springframework.dao异常层次结构。 如PersistenceExceptions未选中,它们也可能被抛出(不过,在异常方面牺牲了通用 DAO 抽象)。spring-doc.cadn.net.cn

下图显示了 Spring 提供的异常层次结构。(请注意,图中详述的类层次结构仅显示整个DataAccessException层次结构。spring-doc.cadn.net.cn

数据访问异常

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

保证您的数据访问对象 (DAO) 或存储库提供异常转换的最佳方法是使用@Repository注解。 此注解还允许组件扫描支持查找和配置您的 DAO 和存储库而无需为它们提供 XML 配置条目。以下示例显示了如何使用@Repository注解:spring-doc.cadn.net.cn

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

任何 DAO 或存储库实现都需要访问持久性资源,取决于所使用的持久性技术。例如,基于 JDBC 的存储库需要访问 JDBCDataSource,并且基于 JPA 的存储库需要访问EntityManager. 实现此目的的最简单方法是将此资源依赖项注入,方法是使用@Autowired,@Inject,@Resource@PersistenceContext附注。 以下示例适用于 JPA 存储库:spring-doc.cadn.net.cn

@Repository
public class JpaMovieFinder implements MovieFinder {

	@PersistenceContext
	private EntityManager entityManager;

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

	@PersistenceContext
	private lateinit var entityManager: EntityManager

	// ...
}

如果您使用经典的 Hibernate API,则可以注入SessionFactory,如下所示示例所示:spring-doc.cadn.net.cn

@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 支持。你可以有DataSource注入到初始化方法或构造函数中,您将在其中创建JdbcTemplate和其他数据访问支持类(例如SimpleJdbcCall等)通过使用DataSource. 以下示例自动连接DataSource:spring-doc.cadn.net.cn

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

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