此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
一般 ORM 集成注意事项
本节重点介绍适用于所有 ORM 技术的注意事项。 Hibernate 部分提供了更多详细信息,还显示了这些功能和 具体上下文中的配置。
Spring 的 ORM 集成的主要目标是清晰的应用程序分层(使用任何数据 访问和事务技术)以及应用程序对象的松散耦合 — 否 更多业务服务依赖于数据访问或事务策略,不再 硬编码资源查找,不再有难以替换的单例,不再有自定义服务 登记处。目标是采用一种简单且一致的方法来连接应用程序对象,保持 它们尽可能可重用且不受容器依赖。所有个人 数据访问功能可以单独使用,但与 Spring 的 应用程序上下文概念,提供基于 XML 的配置和交叉引用 不需要 Spring 感知的普通 JavaBean 实例。在典型的 Spring 应用程序中, 许多重要的对象都是 JavaBeans:数据访问模板、数据访问对象、 事务管理器、使用数据访问对象和事务的业务服务 管理器、Web 视图解析器、使用业务服务的 Web 控制器等。
资源和事务管理
典型的业务应用程序充斥着重复的资源管理代码。 许多项目试图发明自己的解决方案,有时会牺牲适当的处理 为了方便编程而失败。Spring 提倡简单的解决方案,以实现适当的 资源处理,即 JDBC 的情况下通过模板化和应用 AOP 进行 IoC ORM 技术的拦截器。
基础结构提供适当的资源处理和适当的转换
特定 API 异常到未选中的基础结构异常层次结构。Spring
引入了适用于任何数据访问策略的 DAO 异常层次结构。对于直接
JDBC 中,则JdbcTemplate
上一节中提到的类提供了连接处理和正确的转换SQLException
到DataAccessException
层次结构,包括特定于数据库的 SQL 错误的转换
代码到有意义的异常类。对于 ORM 技术,请参阅下一节,了解如何获取相同的异常
翻译好处。
在事务管理方面,JdbcTemplate
类连接到 Spring
事务支持并支持 JTA 和 JDBC 事务,通过各自的
Spring 事务管理器。对于支持的 ORM 技术,Spring 提供了 Hibernate
以及通过 Hibernate 和 JPA 事务管理器以及 JTA 支持的 JPA 支持。
有关事务支持的详细信息,请参阅事务管理一章。
异常转换
当你在 DAO 中使用 Hibernate 或 JPA 时,你必须决定如何处理持久性
技术的本机异常类。DAO 抛出一个HibernateException
或PersistenceException
,取决于技术。这些异常都是运行时
例外,并且不必声明或捕获。您可能还必须处理IllegalArgumentException
和IllegalStateException
.这意味着调用方只能
将异常视为通常是致命的,除非它们想要依赖于持久性
技术自己的异常结构。捕捉特定原因(例如乐观
锁定失败)如果不将调用者绑定到实现策略,则不可能。
对于强基于 ORM 或
不需要任何特殊的例外处理(或两者兼而有之)。但是,Spring 让例外
翻译通过@Repository
注解。以下内容
示例(一个用于 Java 配置,一个用于 XML 配置)显示了如何执行此作:
-
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>
后处理器自动查找所有异常转换器(
这PersistenceExceptionTranslator
接口),并通知所有标有@Repository
注释,以便发现的翻译器可以拦截并应用
对引发的异常进行适当的翻译。
综上所述,您可以基于普通持久化技术的 API 和 注释,同时仍然受益于 Spring 管理的事务、依赖项 注入,以及透明异常转换(如果需要)到 Spring 的自定义 异常层次结构。