Introduction to ORM with Spring
Spring 框架支持与 Java Persistence API(JPA)的集成,并支持本地 Hibernate 的资源管理、数据访问对象(DAO)实现和事务策略。例如,对于 Hibernate,有一流的支持,有几个方便的 IoC 功能,解决了许多典型的 Hibernate 集成问题。你可以通过依赖注入为 OR(对象关系)映射工具配置所有支持的功能。它们可以参与 Spring 的资源和事务管理,并且符合 Spring 的通用事务和 DAO 异常层次结构。推荐的集成方式是针对普通的 Hibernate 或 JPA API 编码 DAO。
当你创建数据访问应用程序时,Spring 为你选择的 ORM 层增加了重要的增强功能。你可以随心所欲地利用集成支持,你应该将这种集成工作与内部构建类似基础设施的成本和风险进行比较。你可以像使用库一样使用大部分 ORM 支持,而不用考虑技术问题,因为一切都被设计成一组可重用的 JavaBeans。Spring IoC 容器中的 ORM 有利于配置和部署。因此,本节中的大多数例子都显示了在 Spring 容器内的配置。
使用 Spring 框架来创建你的 ORM DAO 的好处包括:
更容易测试:Spring 的 IoC 方法使得交换 Hibernate SessionFactory 实例、JDBC DataSource 实例、事务管理器和映射对象实现(如果需要)的实现和配置位置变得容易。这反过来又使得隔离测试每一段持久性相关的代码变得更加容易。
常见的数据访问异常:Spring 可以包装来自 ORM 工具的异常,将它们从专有的(可能被检查的)异常转换为通用的运行时 DataAccessException 层次结构。这个特性让你可以只在适当的层中处理大多数持久性异常,这些异常是不可恢复的,而不需要烦人的模板捕获、抛出和异常声明。你仍然可以根据需要捕获和处理异常。请记住,JDBC 的异常(包括 DB 特定的方言)也被转换为相同的层次,这意味着你可以在一个一致的编程模型中用 JDBC 进行一些操作。
通用的资源管理:Spring 应用程序上下文可以处理 Hibernate SessionFactory 实例、JPA EntityManagerFactory 实例、JDBC DataSource 实例和其他相关资源的位置和配置。这使得这些值易于管理和改变。Spring 提供了高效、简单、安全的持久化资源处理。例如,使用 Hibernate 的相关代码一般需要使用相同的 Hibernate Session,以确保效率和正确的事务处理。Spring 通过 Hibernate SessionFactory 暴露出当前的 Session,从而使创建和绑定 Session 到当前线程的工作变得简单透明。因此,Spring 解决了典型 Hibernate 使用中的许多慢性问题,适用于任何本地或 JTA 事务环境。
集成的事务管理:你可以通过
@Transactional
注解或在 XML 配置文件中明确配置事务 AOP advice,用声明性的、面向切面编程(AOP)风格的方法拦截器来包装你的 ORM 代码。在这两种情况下,事务语义和异常处理(回滚等)都会为你处理。正如在 资源和事务管理 中所讨论的,你也可以交换各种事务管理器,而不影响你的 ORM 相关代码。例如,你可以在本地事务和 JTA 之间互换,两种情况下都有相同的完整服务(如声明性事务)。此外,JDBC 相关的代码可以与你用来做 ORM 的代码完全集成事务。这对于不适合 ORM 的数据访问(如批处理和 BLOB 流),但仍然需要与 ORM 操作共享共同的事务是非常有用的。
:::tips 对于更全面的 ORM 支持,包括对 MongoDB 等替代数据库技术的支持,你可能想看看 Spring Data 项目套件。如果你是一个 JPA 用户,来自 https://spring.io 的《用 JPA 访问数据入门》指南提供了一个很好的介绍。 :::