转载自:这里
org.springframework.orm.hibernate3
类 HibernateTransactionManager
java.lang.Object org.springframework.transaction.support.AbstractPlatformTransactionManager org.springframework.orm.hibernate3.HibernateTransactionManager
-
所有已实现的接口:
- java.io.Serializable, BeanFactoryAware, InitializingBean, PlatformTransactionManager, ResourceTransactionManager
public class HibernateTransactionManager extends AbstractPlatformTransactionManager implements ResourceTransactionManager, BeanFactoryAware, InitializingBean
PlatformTransactionManager
实施单一Hibernate的SessionFactory
。绑定一个指定的工厂的Hibernate Session从到线程,可能。允许一个线程每绑定会话工厂SessionFactoryUtils
和 HibernateTemplate
是线程绑定会话了解和参与这种交易自动。使用上述两种或通过将这些 SessionFactory.getCurrentSession()
是必需的Hibernate访问代码,这需要支持事务处理机制。
支持自定义隔离级别,并且将它作为应用Hibernate事务超时超时。
此项交易的应用程序管理器使用一个单一的交易数据访问Hibernate的SessionFactory恰当,但它也支持直接数据源在一个交易( 即纯JDBC代码相同的数据源工作)的访问。这允许它访问Hibernate和服务的使用(没有被察觉的Hibernate)纯JDBC混合服务! 应用程序代码需要坚持到相同的简单连接查找与模式作为 DataSourceTransactionManager
(即 DataSourceUtils.getConnection(javax.sql.DataSource)
或经历一个 TransactionAwareDataSourceProxy
)。
注:为了能够为普通的JDBC代码登记一个数据源的连接,这种情况需要(了解数据源setDataSource(javax.sql.DataSource)
)。给定的数据源,显然应该匹配给定的SessionFactory使用的方法 。为了实现这一目标,同时配置相同的JNDI数据源,或者最好使用SessionFactory的创建 LocalSessionFactoryBean
和本地数据源(将由本次交易经理自动检测)。
JTA的(通常是通过JtaTransactionManager
)可以在同一事务中访问多个事务性资源的需要。 Hibernate使用的数据源是JTA需要在这种情况下(见容器设置)启用。通常情况下,对Hibernate的JTA设置有点容器特定由于到JTA TransactionManager的查找,正确的SessionFactory级别的事务处理读写缓存需要。
幸运的是,与春天更简单的方法: SessionFactoryUtils
(因此HibernateTemplate
)寄存器的同步与Spring TransactionSynchronizationManager
(如使用JtaTransactionManager
),为了正确后完成回调 。因此,只要Spring的JtaTransactionManager长途驾驶的JTA事务,Hibernate不要求任何适当的JTA参加的特别配置 。请注意,有特别的限制的JTA子系统与EJB CMT和限制性:参见 JtaTransactionManager
的详情的javadoc。
基于JDBC 3.0中,此嵌套事务管理器支持通过JDBC 3.0保存点交易。该AbstractPlatformTransactionManager.setNestedTransactionAllowed(boolean)
“nestedTransactionAllowed ”}标志默认为“假”,但是,正如嵌套事务只会适用于JDBC连接,而不是Hibernate的Session和缓存的对象 。您可以手动设置“标志,以”真,如果你想使用Hibernate事务嵌套事务的JDBC访问代码中的参与(前提是你的JDBC驱动程序支持保存点)。 注意Hibernate本身不支持嵌套事务!因此,不要指望Hibernate访问代码语义参加一个嵌套事务。
需要休眠3.1或更高版本,如春天的2.5。