对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
一般 ORM 集成注意事项
本节重点介绍适用于所有 ORM 技术的注意事项。 Hibernate 部分提供了更多详细信息,还显示了这些功能和 配置。
Spring 的 ORM 集成的主要目标是清晰的应用程序分层(包含任何数据 Access 和 Transaction 技术)以及应用程序对象的松散耦合 — 否 更多的业务服务依赖于数据访问或事务策略,仅此而已 硬编码的资源查找,不再有难以替换的单例,不再有自定义服务 登记处。目标是使用一种简单而一致的方法来连接应用程序对象,同时保持 它们尽可能可重用且不受容器依赖项的约束。所有个体 数据访问功能可以单独使用,但可以与 Spring 的 application context 概念,提供基于 XML 的配置和 不需要 Spring 感知的普通 JavaBean 实例。在典型的 Spring 应用程序中, 许多重要的对象都是 JavaBeans:数据访问模板、数据访问对象、 事务管理器、使用数据访问对象和事务的业务服务 管理器、Web 视图解析程序、使用业务服务的 Web 控制器等。
资源和事务管理
典型的业务应用程序充满了重复的资源管理代码。 许多项目试图发明自己的解决方案,有时会牺牲适当的处理方式 的失败。Spring 提倡简单的解决方案 资源处理,即在 JDBC 的情况下通过模板进行 IoC 并应用 AOP ORM 技术的拦截器。
基础设施提供适当的资源处理和
特定 API 异常添加到未经检查的基础架构异常层次结构中。Spring
引入了 DAO 异常层次结构,适用于任何数据访问策略。对于直接
JDBC 是上一节中提到的类,它提供连接处理和到层次结构的正确转换,包括特定于数据库的 SQL 错误的转换
代码转换为有意义的异常类。对于 ORM 技术,请参阅下一节以了解如何获得相同的异常
翻译的好处。JdbcTemplate
SQLException
DataAccessException
当涉及到事务管理时,该类与 Spring 挂钩
事务支持并支持 JTA 和 JDBC 事务,通过各自的
Spring 事务管理器。对于支持的 ORM 技术,Spring 提供了 Hibernate
以及通过 Hibernate 和 JPA 事务管理器以及 JTA 支持实现的 JPA 支持。
有关事务支持的详细信息,请参阅 事务管理 章节。JdbcTemplate
异常转换
在 DAO 中使用 Hibernate 或 JPA 时,必须决定如何处理持久性
technology 的原生异常类。DAO 根据技术抛出 a 或 的子类。这些异常都是运行时的
exceptions 的,并且不必声明或捕获。您可能还必须处理 和 。这意味着调用方只能
将异常视为通常是致命的,除非它们想要依赖于持久性
技术自身的异常结构。捕获特定原因(例如乐观的
locking failure)如果不将调用者绑定到 implementation strategy,就不可能。
这种权衡对于强基于 ORM 或
不需要任何特殊的异常处理(或两者)。但是,Spring 允许例外
通过注释透明地应用翻译。以下内容
示例(一个用于 Java 配置,一个用于 XML 配置)展示了如何做到这一点:HibernateException
PersistenceException
IllegalArgumentException
IllegalStateException
@Repository
-
Java
-
Kotlin
@Repository
public class ProductDaoImpl implements ProductDao {
// class body here...
}
@Repository
class ProductDaoImpl : ProductDao {
// class body here...
}
<beans>
<!-- Exception translation bean post processor -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="myProductDao" class="product.ProductDaoImpl"/>
</beans>
后处理器会自动查找所有异常转换器(
接口)并通知所有标有 Comments 的 bean,以便发现的翻译者可以拦截并应用
对引发的异常进行适当的翻译。PersistenceExceptionTranslator
@Repository
总之,您可以基于普通持久化技术的 API 和 注解,同时仍然受益于 Spring 管理的事务、依赖性 injection 和透明异常转换(如果需要)到 Spring 的自定义 异常层次结构。