本节重点介绍适用于所有 ORM 技术的注意事项。 Hibernate 部分提供了更多详细信息,还显示了这些功能和 配置。spring-doc.cn

Spring 的 ORM 集成的主要目标是清晰的应用程序分层(包含任何数据 Access 和 Transaction 技术)以及应用程序对象的松散耦合 — 否 更多的业务服务依赖于数据访问或事务策略,仅此而已 硬编码的资源查找,不再有难以替换的单例,不再有自定义服务 登记处。目标是使用一种简单而一致的方法来连接应用程序对象,同时保持 它们尽可能可重用且不受容器依赖项的约束。所有个体 数据访问功能可以单独使用,但可以与 Spring 的 application context 概念,提供基于 XML 的配置和 不需要 Spring 感知的普通 JavaBean 实例。在典型的 Spring 应用程序中, 许多重要的对象都是 JavaBeans:数据访问模板、数据访问对象、 事务管理器、使用数据访问对象和事务的业务服务 管理器、Web 视图解析程序、使用业务服务的 Web 控制器等。spring-doc.cn

资源和事务管理

典型的业务应用程序充满了重复的资源管理代码。 许多项目试图发明自己的解决方案,有时会牺牲适当的处理方式 的失败。Spring 提倡简单的解决方案 资源处理,即在 JDBC 的情况下通过模板进行 IoC 并应用 AOP ORM 技术的拦截器。spring-doc.cn

基础设施提供适当的资源处理和 特定 API 异常添加到未经检查的基础架构异常层次结构中。Spring 引入了 DAO 异常层次结构,适用于任何数据访问策略。对于直接 JDBC 是上一节中提到的类,它提供连接处理和到层次结构的正确转换,包括特定于数据库的 SQL 错误的转换 代码转换为有意义的异常类。对于 ORM 技术,请参阅下一节以了解如何获得相同的异常 翻译的好处。JdbcTemplateSQLExceptionDataAccessExceptionspring-doc.cn

当涉及到事务管理时,该类与 Spring 挂钩 事务支持并支持 JTA 和 JDBC 事务,通过各自的 Spring 事务管理器。对于支持的 ORM 技术,Spring 提供了 Hibernate 以及通过 Hibernate 和 JPA 事务管理器以及 JTA 支持实现的 JPA 支持。 有关事务支持的详细信息,请参阅 事务管理 章节。JdbcTemplatespring-doc.cn

异常转换

在 DAO 中使用 Hibernate 或 JPA 时,必须决定如何处理持久性 technology 的原生异常类。DAO 根据技术抛出 a 或 的子类。这些异常都是运行时的 exceptions 的,并且不必声明或捕获。您可能还必须处理 和 。这意味着调用方只能 将异常视为通常是致命的,除非它们想要依赖于持久性 技术自身的异常结构。捕获特定原因(例如乐观的 locking failure)如果不将调用者绑定到 implementation strategy,就不可能。 这种权衡对于强基于 ORM 或 不需要任何特殊的异常处理(或两者)。但是,Spring 允许例外 通过注释透明地应用翻译。以下内容 示例(一个用于 Java 配置,一个用于 XML 配置)展示了如何做到这一点:HibernateExceptionPersistenceExceptionIllegalArgumentExceptionIllegalStateException@Repositoryspring-doc.cn

@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@Repositoryspring-doc.cn

总之,您可以基于普通持久化技术的 API 和 注解,同时仍然受益于 Spring 管理的事务、依赖性 injection 和透明异常转换(如果需要)到 Spring 的自定义 异常层次结构。spring-doc.cn