Transaction Management Strategies

    TransactionTemplate 和 TransactionInterceptor 都将实际的事务处理委托给 PlatformTransactionManager 实例(它可以是一个 HibernateTransactionManager(针对单一的 Hibernate SessionFactory),通过使用引擎盖下的 ThreadLocal Session)或 Hibernate 应用程序的 JtaTransactionManager(委托给容器的 JTA 子系统)。你甚至可以使用一个自定义的 PlatformTransactionManager 实现。从原生的 Hibernate 事务管理切换到 JTA(比如当你的应用程序的某些部署面临分布式事务需求时),只是一个配置问题。你可以用 Spring 的 JTA 事务实现取代 Hibernate 事务管理器。事务分界和数据访问代码都无需改变,因为它们使用通用的事务管理 API。

    对于跨越多个 Hibernate 会话工厂的分布式事务,你可以将 JtaTransactionManager 作为事务策略与多个 LocalSessionFactoryBean 定义相结合。然后,每个 DAO 获得一个特定的 SessionFactory 引用,传递到其相应的 bean 属性中。如果所有底层的 JDBC 数据源都是事务性的容器数据源,那么只要使用 JtaTransactionManager 作为策略,业务服务就可以在任何数量的 DAO 和任何数量的会话工厂之间划分事务,而无需特别考虑。

    HibernateTransactionManager 和 JtaTransactionManager 都允许用 Hibernate 进行适当的 JVM 级缓存处理,不需要容器特定的事务管理器查找或 JCA 连接器(如果你不使用 EJB 来启动事务)。

    HibernateTransactionManager 可以将 Hibernate JDBC 连接导出为特定 DataSource 的普通 JDBC 访问代码。这种能力允许在完全没有 JTA 的情况下,用混合的 Hibernate 和 JDBC 数据访问进行高级事务划分,只要你只访问一个数据库。如果你通过 LocalSessionFactoryBean 类的dataSource 属性为传入的 SessionFactory 设置了数据源,那么 HibernateTransactionManager 会自动将 Hibernate 事务暴露为 JDBC 事务。另外,你也可以通过 HibernateTransactionManager 类的 dataSource 属性明确指定事务应该被暴露的数据源。