Spring ORM 简介

Spring Framework 支持与 Java Persistence API (JPA) 集成,并支持原生的 Hibernate 用于资源管理、数据访问对象 (DAO) 实现和事务策略。例如,对于 Hibernate,它提供一流的支持以及若干便利的 IoC 特性,这些特性解决了许多典型的 Hibernate 集成问题。你可以通过依赖注入配置所有支持的 OR (对象关系) 映射工具的功能。它们可以参与 Spring 的资源和事务管理,并且它们符合 Spring 的通用事务和 DAO 异常层次结构。推荐的集成方式是根据纯粹的 Hibernate 或 JPA API 编写 DAO。

当你创建数据访问应用时,Spring 为你选择的 ORM 层添加了显著增强。你可以根据需要利用尽可能多的集成支持,并且你应该将这种集成工作与内部构建类似基础设施的成本和风险进行比较。你可以像使用库一样使用大部分 ORM 支持,无论技术如何,因为所有东西都被设计为一组可重用的 JavaBean。Spring IoC 容器中的 ORM 有助于配置和部署。因此,本节中的大多数示例都展示了 Spring 容器内的配置。

使用 Spring Framework 创建 ORM DAO 的好处包括:

  • 更容易测试。 Spring 的 IoC 方法使得轻松切换 Hibernate SessionFactory 实例、JDBC DataSource 实例、事务管理器和映射对象实现的实现及配置位置变得容易(如果需要)。这反过来又使得更容易隔离地测试持久化相关的代码片段。

  • 统一的数据访问异常。 Spring 可以包装你的 ORM 工具抛出的异常,将它们从专有的(可能是受检的)异常转换为通用的运行时 DataAccessException 层次结构。此功能使你能够在适当的层中处理大多数持久化异常(这些异常是不可恢复的),而无需烦人的样板式 catch、throws 和异常声明。你仍然可以在必要时捕获和处理异常。请记住,JDBC 异常(包括特定于数据库的方言)也被转换为相同的层次结构,这意味着你可以在一致的编程模型中执行一些 JDBC 操作。

  • 通用的资源管理。 Spring 应用上下文可以处理 Hibernate SessionFactory 实例、JPA EntityManagerFactory 实例、JDBC DataSource 实例和其他相关资源的位置和配置。这使得这些值的管理和更改变得容易。Spring 提供高效、简单和安全的持久化资源处理。例如,使用 Hibernate 的相关代码通常需要使用相同的 Hibernate Session 来确保效率和正确的事务处理。Spring 通过 Hibernate SessionFactory 透明地暴露一个当前 Session,使得创建和绑定 Session 到当前线程变得容易。因此,对于任何本地或 JTA 事务环境,Spring 解决了许多典型 Hibernate 使用中的长期存在的问题。

  • 集成的事务管理。 你可以使用声明式的面向切面编程 (AOP) 风格方法拦截器包装你的 ORM 代码,可以通过 @Transactional 注解或通过在 XML 配置文件中显式配置事务 AOP advice。在这两种情况下,事务语义和异常处理(回滚等)都为你处理。正如 资源和事务管理 中讨论的,你还可以切换各种事务管理器,而不会影响你的 ORM 相关代码。例如,你可以在本地事务和 JTA 之间切换,在这两种场景中都可使用相同的完整服务(例如声明式事务)。此外,JDBC 相关代码可以与你用于 ORM 的代码在事务上完全集成。这对于不适合 ORM 的数据访问(例如批量处理和 BLOB 流处理)很有用,这些数据访问仍然需要与 ORM 操作共享公共事务。

为了获得更全面的 ORM 支持,包括对 MongoDB 等其他数据库技术的支持,你可能需要查看 Spring Data 项目套件。如果你是 JPA 用户,spring.io 上的 开始使用 JPA 访问数据 指南提供了一个很好的入门介绍。