Spring中的ORM简介

Spring框架支持与Java持久化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实例、JDBC DataSource实例、事务管理器和映射对象实现(如果需要)的实现和配置位置。这反过来使得更容易测试与持久化相关的每个代码片段。

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

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

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

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