使用 Spring 进行 ORM 简介

Spring 框架支持与 Java Persistence API(JPA)的集成,并为资源管理、数据访问对象(DAO)实现和事务策略提供对原生 Hibernate 的支持。例如,对于 Hibernate,Spring 提供了一流的支持,包含多项便捷的 IoC 特性,可解决许多典型的 Hibernate 集成问题。您可以通过依赖注入来配置所有受支持的对象关系(OR)映射工具的功能。这些工具可以参与 Spring 的资源和事务管理,并遵循 Spring 通用的事务和 DAO 异常层次结构。推荐的集成方式是使用普通的 Hibernate 或 JPA API 编写 DAO。spring-doc.cadn.net.cn

当你构建数据访问应用程序时,Spring 会为你所选择的 ORM 层提供显著增强。你可以根据需要充分利用其集成支持,并应将这种集成工作与自行构建类似基础设施的成本和风险进行比较。由于所有组件均被设计为一组可重用的 JavaBean,因此无论采用何种技术,你都可以像使用库一样使用大部分 ORM 支持功能。在 Spring IoC 容器中使用 ORM 能够简化配置和部署。因此,本节中的大多数示例都展示了在 Spring 容器内部的配置方式。spring-doc.cadn.net.cn

使用 Spring Framework 创建 ORM DAO 的好处包括:spring-doc.cadn.net.cn

  • 更简便的测试。 Spring 的 IoC 方法使得轻松替换 Hibernate SessionFactory 实例、JDBC DataSource 实例、事务管理器以及映射对象的实现(如有需要)及其配置位置成为可能。这反过来使得对每个与持久化相关的代码单元进行隔离测试变得更加容易。spring-doc.cadn.net.cn

  • 通用的数据访问异常。 Spring 可以包装来自你所使用的 ORM 工具的异常, 将其从专有的(可能是受检的)异常转换为统一的运行时 DataAccessException 异常体系。这一特性使你能够在适当的层次中处理大多数不可恢复的持久化异常, 而无需编写繁琐的 catch、throws 和异常声明样板代码。你仍然可以根据需要捕获并处理异常。 请记住,JDBC 异常(包括特定数据库的方言异常)也会被转换到相同的异常体系中, 这意味着你可以在一致的编程模型中使用 JDBC 执行某些操作。spring-doc.cadn.net.cn

  • 通用资源管理。 Spring 应用上下文可以处理 Hibernate SessionFactory 实例、JPA EntityManagerFactory 实例、JDBC DataSource 实例以及其他相关资源的位置和配置。这使得这些值易于管理和更改。Spring 提供了对持久化资源的高效、简便且安全的处理方式。例如,使用 Hibernate 的相关代码通常需要使用同一个 Hibernate Session,以确保效率和正确的事务处理。Spring 通过 Hibernate Session 暴露当前 Session,从而透明地在当前线程中轻松创建并绑定 SessionFactory。因此,无论是在本地事务环境还是 JTA 事务环境中,Spring 都解决了典型 Hibernate 使用中的许多长期存在的问题。spring-doc.cadn.net.cn

  • 集成的事务管理。 您可以使用 @Transactional 注解或者通过显式地在 XML 配置文件中配置事务 AOP 建议来将您的 ORM 代码包裹在一个声明式的、面向切面编程(AOP)风格的方法拦截器中。无论哪种情况,事务语义和异常处理(回滚等)都将由 Spring 框架为您处理。正如在 资源与事务管理 中所讨论的那样,在不干扰您的 ORM 相关代码的前提下,您也可以更换各种事务管理器。例如,您可以在这两种场景(本地事务和 JTA)之间切换,并且在两种情况下都可以使用声明式的事务功能等全套服务。此外,JDBC 相关的代码可以完全与用于 ORM 的代码进行事务集成。这对于不适合使用 ORM 进行数据访问的情况(如批量处理和 BLOB 流式传输)非常有用,但仍需要共享与 ORM 操作相同的常见事务。spring-doc.cadn.net.cn

如需更全面的 ORM 支持,包括对 MongoDB 等其他数据库技术的支持,您可以查看 Spring Data 项目套件。如果您使用 JPA,spring.io 上的 《使用 JPA 访问数据入门指南》 提供了极佳的入门介绍。