# 4.1Spring ORM介绍

Spring Framework支持与Java Persistence API（JPA）集成，并支持用于资源管理，数据访问对象（DAO）实现和事务策略的本地Hibernate。例如，对于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实例，JDBC DataSource实例，事务管理器和映射对象实现（如果需要）的实现和配置位置变得容易。反过来，这使得隔离每个与持久性相关的代码片段的测试变得容易得多。
* 常见的数据访问异常。 Spring可以包装您的ORM工具中的异常，将其从专有（可能已检查）的异常转换为通用的运行时DataAccessException层次结构。通过此功能，您可以仅在适当的层中处理大多数不可恢复的持久性异常，而不会烦人样板捕获，抛出和异常声明。您仍然可以根据需要捕获和处理异常。请记住，JDBC异常（包括特定于DB的方言）也将转换为相同的层次结构，这意味着您可以在一致的编程模型中使用JDBC执行某些操作。
* 常规资源管理。 Spring应用程序上下文可以处理Hibernate SessionFactory实例，JPA EntityManagerFactory实例，JDBC DataSource实例和其他相关资源的位置和配置。这使得这些值易于管理和更改。 Spring提供了对持久性资源的高效，便捷和安全的处理。例如，使用Hibernate的相关代码通常需要使用相同的Hibernate Session，以确保效率和适当的事务处理。通过通过Hibernate SessionFactory公开当前Session，Spring可以轻松地透明地创建Session并将其绑定到当前线程。因此，对于任何本地或JTA事务环境，Spring都解决了典型的Hibernate使用中的许多长期问题。
* 集成交易管理。您可以通过@Transactional批注或通过在XML配置文件中显式配置事务AOP建议，使用声明性的，面向方面的编程（AOP）风格的方法拦截器包装ORM代码。在这两种情况下，都会为您处理事务语义和异常处理（回滚等）。如资源和事务管理中所述，您还可以交换各种事务管理器，而不会影响与ORM相关的代码。例如，您可以在两种情况下使用相同的完整服务（例如声明性事务）在本地事务和JTA之间进行交换。此外，与JDBC相关的代码可以与您用于执行ORM的代码完全事务集成。这对于不适合ORM（例如批处理和BLOB流）但仍需要与ORM操作共享常见事务的数据访问很有用。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.flydean.com/spring-framework-documentation5/dataaccess/4.0orm/4.1spring-orm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
