Spring 中的 ORM 简介

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

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

使用 Spring 框架创建 ORM DAO 的好处包括

  • 更轻松的测试。 Spring 的 IoC 方法使交换 Hibernate SessionFactory 实例、JDBC DataSource 实例、事务管理器和映射对象实现(如果需要)的实现和配置位置变得容易。这反过来使得更容易地独立测试每个与持久性相关的代码部分。

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

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

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

有关更全面的 ORM 支持,包括对 MongoDB 等替代数据库技术的支持,您可能需要查看 Spring Data 项目套件。如果您是 JPA 用户,使用 JPA 访问数据的入门指南 来自 spring.io 提供了一个很好的介绍。