本部分重点介绍适用于所有 ORM 技术的注意事项。 Hibernate 部分提供了更多详细信息,并展示了这些功能和 具体上下文中的配置。

Spring 的 ORM 集成的主要目标是清晰的应用程序分层(使用任何数据 访问和事务技术)和应用程序对象的松散耦合 — 否 更多的业务服务依赖于数据访问或事务策略,不再 硬编码资源查找,不再有难以替换的单例,不再有自定义服务 登记处。目标是采用一种简单且一致的方法来连接应用程序对象,将 它们尽可能可重用且不受容器依赖。所有个人 数据访问功能可以单独使用,但可以与 Spring 很好地集成 应用程序上下文概念,提供基于 XML 的配置和 不需要 Spring 感知的普通 JavaBean 实例。在典型的 Spring 应用程序中, JavaBeans 的许多重要对象:数据访问模板、数据访问对象、 事务管理器、使用数据访问对象和事务的业务服务 管理器、Web 视图解析程序、使用业务服务的 Web 控制器等。

资源和事务管理

典型的业务应用程序充斥着重复的资源管理代码。 许多项目试图发明自己的解决方案,有时会牺牲适当的处理 为方便编程而失败。Spring 提倡简单的解决方案,以适当的方式 资源处理,即在JDBC的情况下通过模板化和应用AOP的IoC ORM技术的拦截器。

基础结构提供适当的资源处理和适当的转换 未经检查的基础结构例外层次结构的特定 API 例外。春天 引入了适用于任何数据访问策略的 DAO 异常层次结构。对于直接 JDBC,上一节中提到的类提供连接处理和到层次结构的正确转换,包括特定于数据库的 SQL 错误的转换 代码到有意义的异常类。对于 ORM 技术,请参阅下一节,了解如何获取相同的异常 翻译的好处。JdbcTemplateSQLExceptionDataAccessException

在事务管理方面,该类与 Spring 挂钩 事务支持,并支持 JTA 和 JDBC 事务,通过各自 Spring 事务管理器。对于支持的 ORM 技术,Spring 提供了 Hibernate 以及通过 Hibernate 和 JPA 事务管理器提供的 JPA 支持以及 JTA 支持。 有关事务支持的详细信息,请参阅事务管理一章。JdbcTemplate

异常翻译

在 DAO 中使用 Hibernate 或 JPA 时,必须决定如何处理持久性 技术的本机异常类。DAO 抛出 或 的子类,具体取决于技术。这些异常都是运行时 例外情况,不必声明或捕获。您可能还需要处理 和 .这意味着呼叫者只能 将异常视为通常致命的,除非它们希望依赖于持久性 技术自身的异常结构。捕捉特定原因(例如乐观 锁定失败)如果不将调用方与实现策略联系起来,则是不可能的。 这种权衡对于强基于 ORM 或 不需要任何特殊的例外处理(或两者兼而有之)。但是,Spring 允许例外 通过注释透明地应用翻译。以下 示例(一个用于 Java 配置,一个用于 XML 配置)展示了如何执行此操作:HibernateExceptionPersistenceExceptionIllegalArgumentExceptionIllegalStateException@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>

后处理器会自动查找所有异常转换器(实现 接口),并建议所有标有注解的 Bean,以便发现的翻译人员可以拦截并应用 对抛出的异常进行适当的翻译。PersistenceExceptionTranslator@Repository

综上所述,您可以基于普通持久化技术的 API 和 注解,同时仍然受益于 Spring 管理的事务、依赖关系 注入,以及透明异常转换(如果需要)到 Spring 的自定义 异常层次结构。