使用Spring进行ORM介绍
Spring框架支持与Java持久化API(JPA)的集成,并支持使用原生Hibernate进行资源管理、数据访问对象(DAO)实现以及事务策略的管理。例如,对于Hibernate,Spring提供了全方位的支持,包括多种便捷的IoC(控制反转)特性,这些特性能够解决许多典型的Hibernate集成问题。你可以通过依赖注入(Dependency Injection)来配置所有受支持的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的相关代码通常需要使用同一个Session来确保效率和正确的事务处理。Spring通过 HibernateSessionFactory透明地创建并绑定Session到当前线程,从而轻松解决了典型Hibernate使用中存在的许多问题,无论是在本地事务环境还是JTA事务环境中都是如此。 -
集成化的事务管理。 你可以通过
@Transactional注解或者通过在XML配置文件中显式配置事务AOP建议来用声明式的、面向切面的编程(AOP)风格的方法拦截器包装你的ORM代码。在这两种情况下,事务语义和异常处理(如回滚等)都会由Spring帮你处理。正如在资源与事务管理中讨论的,你也可以更换不同的事务管理器,而不会影响与ORM相关的代码。例如,你可以在本地事务和JTA之间进行切换,在这两种情况下都可以使用相同的功能(如声明式事务)。此外,与JDBC相关的代码可以完全与用于ORM的代码进行事务集成。这对于不适合使用ORM的数据访问操作(如批量处理和BLOB流处理)来说非常有用,因为这些操作仍然需要与ORM操作共享事务。
如需更全面的ORM支持,包括对MongoDB等替代数据库技术的支持,您可以了解一下Spring Data项目套件。如果您是JPA用户,spring.io提供的使用JPA开始访问数据指南会是一个很好的入门介绍。