Spring 中的数据访问对象 (DAO) 支持旨在使其易于使用 数据访问技术(如 JDBC、Hibernate 或 JPA)以一致的方式。这 让你相当容易地在上述持久化技术之间切换, 它还允许您编写代码,而无需担心捕获 特定于每种技术。
一致的异常层次结构
Spring 提供了从特定于技术的异常(例如到其自己的异常类层次结构)的便捷转换,该层次结构具有
root 异常。这些异常包装了原始异常,因此永远不会有
您可能会丢失有关可能出错的任何信息的任何风险。SQLException
DataAccessException
除了 JDBC 异常之外, Spring 还可以包装特定于 JPA 和 Hibernate 的异常。 将它们转换为一组 Focused Runtime 异常。这让你处理大多数 不可恢复的持久性异常,而没有 DAO 中烦人的样板捕获和抛出块和异常声明。 (不过,您仍然可以在需要的任何位置捕获和处理异常。如上所述, JDBC 异常(包括特定于数据库的方言)也会转换为相同的 层次结构,这意味着您可以在一致的 编程模型。
前面的讨论适用于 Spring 支持中的各种模板类
适用于各种 ORM 框架。如果使用基于侦听器的类,则应用程序必须
关心处理和自身,最好由
分别委托给 的 或 方法。这些方法将异常
添加到与 Exception 层次结构中的异常兼容的 Exception。如果不加以控制,它们也可能被抛出
(不过,在例外方面牺牲了通用的 DAO 抽象)。HibernateExceptions
PersistenceExceptions
convertHibernateAccessException(..)
convertJpaAccessException(..)
SessionFactoryUtils
org.springframework.dao
PersistenceExceptions
下图显示了 Spring 提供的异常层次结构。
(请注意,图中详述的类层次结构仅显示整个层次结构的一个子集。DataAccessException
用于配置 DAO 或存储库类的注释
保证您的数据访问对象 (DAO) 或存储库提供
exception translation 是使用 annotation。此注释还
让组件扫描支持人员查找和配置您的 DAO 和存储库
而无需为它们提供 XML 配置条目。以下示例显示了
如何使用注释:@Repository
@Repository
-
Java
-
Kotlin
@Repository (1)
public class SomeMovieFinder implements MovieFinder {
// ...
}
1 | 注释。@Repository |
@Repository (1)
class SomeMovieFinder : MovieFinder {
// ...
}
1 | 注释。@Repository |
任何 DAO 或存储库实现都需要访问持久化资源,
取决于使用的持久性技术。例如,基于 JDBC 的存储库
需要访问 JDBC ,而基于 JPA 的存储库需要访问 .实现此目的的最简单方法是具有此资源依赖项
使用 、 或 注释之一注入。以下示例适用于 JPA 存储库:DataSource
EntityManager
@Autowired
@Inject
@Resource
@PersistenceContext
-
Java
-
Kotlin
@Repository
public class JpaMovieFinder implements MovieFinder {
@PersistenceContext
private EntityManager entityManager;
// ...
}
@Repository
class JpaMovieFinder : MovieFinder {
@PersistenceContext
private lateinit var entityManager: EntityManager
// ...
}
如果使用经典的 Hibernate API,则可以注入 ,如下所示
示例显示:SessionFactory
-
Java
-
Kotlin
@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
-
Java
-
Kotlin
@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)
// ...
}
有关如何执行以下操作的详细信息,请参阅每种持久化技术的具体覆盖范围 配置 Application Context 以利用这些注释。 |
1 | 注释。@Repository |
1 | 注释。@Repository |
有关如何执行以下操作的详细信息,请参阅每种持久化技术的具体覆盖范围 配置 Application Context 以利用这些注释。 |