使用 Spring 的 ORM 简介
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
实例、JDBCDataSource
实例、事务管理器和映射对象实现(如果需要)的实现和配置位置变得简单。这反过来使得更容易在隔离的情况下测试每个与持久性相关的代码部分。 -
通用数据访问异常。 Spring 可以包装来自 ORM 工具的异常,将它们从专有(可能是受检的)异常转换为通用的运行时
DataAccessException
层次结构。此功能允许您在适当的层处理大多数持久性异常,这些异常是不可恢复的,而无需烦人的样板代码捕获、抛出和异常声明。您仍然可以根据需要捕获和处理异常。请记住,JDBC 异常(包括特定于数据库的方言)也被转换为相同的层次结构,这意味着您可以在一致的编程模型中使用 JDBC 执行某些操作。 -
通用资源管理。 Spring 应用上下文可以处理 Hibernate
SessionFactory
实例、JPAEntityManagerFactory
实例、JDBCDataSource
实例和其他相关资源的位置和配置。这使得这些值易于管理和更改。Spring 提供高效、简单和安全的持久性资源处理。例如,使用 Hibernate 的相关代码通常需要使用相同的 HibernateSession
以确保效率和正确的事务处理。Spring 通过通过 HibernateSessionFactory
暴露当前Session
,使得创建和绑定Session
到当前线程变得简单透明。因此,Spring 解决了典型 Hibernate 使用中的许多长期问题,适用于任何本地或 JTA 事务环境。 -
集成事务管理。 您可以通过
@Transactional
注解或在 XML 配置文件中显式配置事务 AOP 建议,以声明性、面向方面编程(AOP)风格的方法拦截器包装您的 ORM 代码。在这两种情况下,事务语义和异常处理(回滚等)都为您处理。如在资源和事务管理中讨论的,您还可以更换各种事务管理器,而不影响与 ORM 相关的代码。例如,您可以在本地事务和 JTA 之间切换,并且在两种情况下都可以使用相同的完整服务(如声明性事务)。此外,JDBC 相关代码可以与用于执行 ORM 的代码完全集成事务。这对于不适合 ORM 的数据访问(如批处理和 BLOB 流)但仍需要与 ORM 操作共享共同事务的情况非常有用。
要获得更全面的 ORM 支持,包括对 MongoDB 等替代数据库技术的支持,您可能需要查看 Spring Data 项目套件。如果您是 JPA 用户,spring.io 上的 Getting Started Accessing Data with JPA 指南提供了一个很好的介绍。