# 4.2ORM集成的一般注意事项

本节重点介绍适用于所有ORM技术的注意事项。Hibernate部分提供了更多详细信息，并在具体上下文中显示了这些功能和配置。

Spring的ORM集成的主要目标是清晰的应用程序分层（具有任何数据访问和事务技术）以及松散耦合应用程序对象-不再需要业务服务依赖数据访问或事务处理策略，不再需要硬编码的资源查找，更多难以替换的单例，不再需要自定义服务注册表。目标是采用一种简单且一致的方法来连接应用程序对象，使它们尽可能可重用，并且尽可能不受容器依赖。所有单独的数据访问功能都可以单独使用，但可以与Spring的应用程序上下文概念很好地集成，从而提供基于XML的配置和对不需要Spring感知的纯JavaBean实例的交叉引用。在典型的Spring应用程序中，许多重要的对象是JavaBean,包括：数据访问模板，数据访问对象，事务管理器，使用数据访问对象和事务管理器的业务服务，Web视图解析器，使用业务服务的Web控制器等等。

## 4.2.1 资源和事务管理

典型的业务应用程序中充斥着重复的资源管理代码。许多项目试图发明自己的解决方案，有时为了编程方便而牺牲了对故障的正确处理。 Spring提倡简单的解决方案来进行适当的资源处理，即通过在JDBC情况下进行模板化以及为ORM技术应用AOP拦截器来实现IoC。

基础结构提供适当的资源处理，并将特定的API异常适当地转换为未经检查的基础结构异常层次结构。 Spring引入了DAO异常层次结构，适用于任何数据访问策略。对于直接JDBC，上一节中提到的JdbcTemplate类提供连接处理以及将SQLException正确转换为DataAccessException层次结构，包括将特定于数据库的SQL错误代码转换为有意义的异常类。对于ORM技术，请参阅下一节以了解如何获得相同的异常转换好处。

在事务管理方面，JdbcTemplate类通过相应的Spring事务管理器挂接到Spring事务支持并支持JTA和JDBC事务。对于受支持的ORM技术，Spring通过Hibernate和JPA事务管理器提供了Hibernate和JPA支持以及JTA支持。有关事务支持的详细信息，请参见事务管理一章。

## 4.2.2 异常事务

在DAO中使用Hibernate或JPA时，必须决定如何处理持久性技术的本机异常类。根据技术的不同，DAO会抛出HibernateException或PersistenceException的子类。这些异常都是运行时异常，不必声明或捕获。您可能还必须处理IllegalArgumentException和IllegalStateException。这意味着调用者只能将异常视为一般致命的，除非他们想依赖于持久性技术自己的异常结构。如果不将调用者与实现策略联系在一起，则无法捕获特定原因（例如乐观锁定失败）。这种权衡可能对于基于ORM的应用程序或不需要任何特殊异常处理（或两者）都可以接受。但是，Spring允许通过@Repository批注透明地应用异常转换。以下示例（一个用于Java配置，一个用于XML配置）显示了如何执行此操作：

```java
@Repository
public class ProductDaoImpl implements ProductDao {

    // class body here...

}
~~

~~~xml
<beans>

    <!-- Exception translation bean post processor -->
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

    <bean id="myProductDao" class="product.ProductDaoImpl"/>

</beans>
```

后处理器自动查找所有异常转换器（PersistenceExceptionTranslator接口的实现），并建议所有标有@Repository批注的bean，以便发现的转换器可以拦截适当的转换并将其应用于引发的异常。

总之，您可以基于纯持久性技术的API和注解来实现DAO，同时仍可以从Spring管理的事务，依赖项注入和透明的异常转换（如果需要）到Spring的自定义异常层次结构中受益。


---

# 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.2orm-integration.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.
