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