|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
一般ORM集成考虑
本节重点介绍适用于所有ORM技术的相关考虑因素。 休眠部分提供了更多细节,也展示了这些功能, 具体语境下的配置。
Spring ORM 集成的主要目标是清晰的应用分层(包括任何数据) 访问和事务技术)以及应用对象的松散耦合——不 更多业务服务依赖数据访问或交易策略,不再如此 硬编码的资源查找,不再有难以替换的单例,不再有定制服务 登记处。目标是拥有一种简单且一致的方法来连接应用对象,保持 它们尽可能可重用且不依赖容器。所有个体 数据访问功能本身即可使用,但与 Spring 的集成良好 应用上下文概念,提供基于XML的配置和交叉引用 普通的 JavaBean 实例,无需支持 Spring 支持。在典型的春季应用中, 许多重要的对象是 JavaBeans:数据访问模板、数据访问对象, 事务管理器,使用数据访问对象和事务的业务服务 比如管理者、网页视图解析器、使用业务服务的网页控制器等等。
资源与事务管理
典型的业务应用充斥着重复的资源管理代码。 许多项目试图发明自己的解决方案,有时牺牲了正确的处理 为了编程方便而导致的失败。Spring倡导简单的解决方案 资源处理,即通过JDBC模板和应用AOP进行的IoC。 用于ORM技术的拦截器。
基础设施提供适当的资源处理和适当的转换
未检查基础设施异常层级结构中的特定API例外。Spring
引入了适用于任何数据访问策略的DAO异常层级。对于直接
JDBC,那个Jdbc模板前文提到的类提供了连接处理和正确转换SQLException前往DataAccessException层级结构,包括数据库特定SQL错误的翻译
代码指向有意义的例外类。关于 ORM 技术,请参见下一节了解如何获得相同的异常
翻译带来的好处。
在交易管理方面,Jdbc模板班级挂钩到春季
支持交易,并通过各自的 JTA 和 JDBC 交易
春季事务管理器。对于支持的 ORM 技术,Spring 提供了 Hibernate
以及通过Hibernate和JPA事务管理器以及JTA支持的JPA支持。
有关事务支持的详细信息,请参见事务管理章节。
例外翻译
当你在DAO中使用Hibernate或JPA时,必须决定如何处理持久化
技术的原生例外类。DAO抛出了一个子类休眠例外或PersistenceException,取决于技术。这些例外都是运行时的
例外情况,无需声明或发现。你可能还得处理IllegalArgumentException和非法州例外.这意味着来电者只能
除非例外想依赖持久性,否则通常会把例外视为致命的
技术本身的例外结构。捕捉具体原因(例如乐观因素)
锁定失败)在不将调用方绑定于实施策略的情况下是不可能实现的。
这种权衡对于高度基于 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 实现 DAO,并且 注释的同时仍能受益于 Spring 管理的事务,依赖性 注入,以及透明异常转换(如有需要)到 Spring 的自定义 例外层级。