日期:2014-05-16  浏览次数:20557 次

Spring JDBC和Hibernate混用时,如何配置事务管理
    由于我们项目的需求比较变态,一部分功能由于需要通过数据库配置表动态生成持久化逻辑,所以只得采用Spring JDBC,而另一部分的业务数据模型比较固定,所以我打算对这部分使用Hibernate。这样,一个应用系统同时存在Spring JDBC和Hibernate两种持久化技术。
     我采用Spring 2.0,通过给注解驱动的方式进行事务管理,也就是说在Service接口中打@Transaction注解,并在配置文件中配置:
    <bean id="transactionManager"
	class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" /> 

    但是一个Spring容器只能配置一个配置一种类型的事务管理器,要么使用基于JDBC的
  DataSourceTransactionManager,要么使用Hibernate的HibernateTransactionManager。
  现在我是同时需要DataSourceTransactionManager和HibernateTransactionManager,而
   <tx:annotation-driven >只允许设置一个事务管理器。如果我要让Spring JDBC和Hibernate
  这两种方式共存于一个应用系统中,请问该如何配置呢?
      不知哪位朋友有遇到过和我相似的问题,请伸出您的热忱双手吧,帮我分析一下,我快疯了:(
   
1 楼 stamen 2007-10-11  
    我补充一下,同一个表,同一个DAO我不会同时使用JDBC和Hibernate,是一个模块完全使用JDBC,而另外一个模块完成使用Hibernate,所以不会有缓存更新两两不相知的问题。我的问题是一个采用Spring JDBC的模块和一个采用Hibernate的模块共存于一个系统中,我要如何在Spring中进行事务管理配置。谢谢!
2 楼 ghsea 2007-10-11  
dfd
3 楼 realorg 2007-10-12  
关注ing...

4 楼 cammette 2007-12-12  
只要使用org.springframework.orm.hibernate3.HibernateTransactionManager就可以了,不必单独为jdbc配事务
5 楼 freesoul 2007-12-25  
cammette 写道
只要使用org.springframework.orm.hibernate3.HibernateTransactionManager就可以了,不必单独为jdbc配事务


我也有这方面的疑问,那是不是说

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>


	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>


这两者就是完全等价的呢?在一个使用了jdbc和Hibernate的应用中,bean配置随意使用一个即可,或者全部使用HibernateTransactionManager的transactionManager即可呢??

谁能详细说明一下,谢谢!
6 楼 daquan198163 2007-12-25  
http://www.iteye.com/topic/37707
7 楼 freesoul 2007-12-25  
我也找到了Spring API DOC的说明

引用
This transaction manager is appropriate for applications that use a single Hibernate SessionFactory for transactional data access, but it also supports direct DataSource access within a transaction (i.e. plain JDBC code working with the same DataSource). This allows for mixing services which access Hibernate and services which use plain JDBC (without being aware of Hibernate)! Application code needs to stick to the same simple Connection lookup pattern as with DataSourceTransactionManager (i.e. DataSourceUtils.getConnection(javax.sql.DataSource) or going through a TransactionAwareDataSourceProxy).