通用ORM集成考虑事项

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

Spring的ORM集成的主要目标是清晰的应用层分层(与任何数据访问和事务技术)以及应用对象之间的松耦合 - 不再有业务服务对数据访问或事务策略的依赖,不再有硬编码的资源查找,不再有难以替代的单例,不再有自定义服务注册表。目标是拥有一种简单而一致的方法来连接应用对象,使它们尽可能可重用且不受容器依赖。所有单独的数据访问特性都可以单独使用,但与Spring的应用上下文概念很好地集成,提供基于XML的配置和交叉引用普通JavaBean实例,这些实例不需要了解Spring。在典型的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会抛出HibernateExceptionPersistenceException的子类,具体取决于技术。这些异常都是运行时异常,无需声明或捕获。您还可能需要处理IllegalArgumentExceptionIllegalStateException。这意味着调用者只能将异常视为一般致命,除非他们希望依赖于持久化技术自己的异常结构。捕获特定原因(例如乐观锁定失败)是不可能的,除非将调用者与实现策略绑定。这种权衡对于强烈基于ORM的应用程序或不需要任何特殊异常处理(或两者兼有)的应用程序可能是可以接受的。但是,Spring允许通过@Repository注解透明地应用异常转换。以下示例(一个用于Java配置,一个用于XML配置)展示了如何实现:

  • Java

  • Kotlin

@Repository
public class ProductDaoImpl implements ProductDao {

	// class body here...

}
@Repository
class ProductDaoImpl : ProductDao {

	// class body here...

}
<beans>

	<!-- 异常转换bean后处理器 -->
	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

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

</beans>

后处理器会自动查找所有异常转换器(实现PersistenceExceptionTranslator接口)并通知所有标记有@Repository注解的bean,以便发现的转换器可以拦截并对抛出的异常应用适当的转换。

总之,您可以基于纯持久化技术的API和注解实现DAO,同时仍然从Spring管理的事务、依赖注入和透明异常转换(如果需要)中受益,以转换为Spring的自定义异常层次结构。