|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
通用ORM集成注意事项
本节介绍了适用于所有ORM技术的注意事项。 Hibernate部分提供了更多详细信息,并在具体上下文中展示了这些功能和配置。
Spring的ORM集成的主要目标是实现清晰的应用层结构(使用任何数据访问和事务技术)以及应用对象的松散耦合——不再有业务服务对数据访问或事务策略的依赖,不再有硬编码的资源查找,不再有难以替换的单例,不再有自定义的服务注册表。目标是采用一种简单且一致的方法来连接应用对象,尽可能使它们可重用并远离容器依赖。所有的单独的数据访问功能都可以独立使用,但能很好地与Spring的应用上下文概念集成,提供基于XML的配置和对不需要了解Spring的普通JavaBean实例的交叉引用。在典型的Spring应用中,许多重要的对象都是JavaBeans:数据访问模板、数据访问对象、事务管理器、使用数据访问对象和事务管理器的业务服务、Web视图解析器、使用业务服务的Web控制器等等。
资源与事务管理
典型的业务应用程序中充斥着重复的资源管理代码。 许多项目试图自己发明解决方案,有时为了编程的便利而牺牲了对失败的正确处理。 Spring 倡导简单的解决方案来正确处理资源,例如在 JDBC 的情况下通过模板化实现 IoC,并针对 ORM 技术应用 AOP 拦截器。
基础设施提供了适当的资源处理,并将特定API异常适当转换为未检查的基础设施异常层次结构。Spring引入了一个DAO异常层次结构,适用于任何数据访问策略。对于直接JDBC,JdbcTemplate类在前面的部分中提到,提供了连接处理和SQLException到DataAccessException层次结构的适当转换,包括将特定于数据库的SQL错误代码转换为有意义的异常类。对于ORM技术,请参阅下一节了解如何获得相同的异常转换优势。
在事务管理方面,JdbcTemplate类与Spring事务支持集成,并通过各自的Spring事务管理器支持JTA和JDBC事务。对于支持的ORM技术,Spring通过Hibernate和JPA事务管理器以及JTA支持提供Hibernate和JPA支持。有关事务支持的详细信息,请参阅事务管理章节。
异常翻译
当在DAO中使用Hibernate或JPA时,您必须决定如何处理持久化技术的原生异常类。DAO会根据技术的不同抛出HibernateException或PersistenceException的子类。这些异常都是运行时异常,不需要声明或捕获。您可能还需要处理IllegalArgumentException和IllegalStateException。这意味着调用者只能将异常视为一般性致命错误,除非他们希望依赖持久化技术本身的异常结构。如果不将调用者与实现策略绑定,就无法捕获具体的异常原因(例如乐观锁失败)。对于强ORM依赖的应用程序或不需要任何特殊异常处理的应用程序(或两者皆有),这种权衡可能是可以接受的。然而,Spring通过@Repository注解让异常转换可以透明地应用。以下示例(一个用于Java配置,一个用于XML配置)展示了如何操作:
-
Java
-
Kotlin
@Repository
public class ProductDaoImpl implements ProductDao {
// class body here...
}
@Repository
class ProductDaoImpl : ProductDao {
// class body here...
}
<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的自定义异常层次结构)中获益。