Hibernate 与spring jdbcTemplate共享事物的管理

空杯心态虚怀若谷 2012-08-24

公司的项目框架搭建可以说是几经周折。之前的项目一直用的SSH框架,老总觉得这种架构开发效率太低了,建议把hibernate去掉或者换成是其他的持久层框架。我把原有的项目中hibernate的部分给去掉,用spring的jdbcTemplate来操作数据库。后来发现,这样做有些时候也是很费劲的,尤其是对大表的操作。为提高开发效率,又引入了hibernate框架。这样一来,即可以通过spring的jdbcTemplate直接访问数据库也可以通过hibernate来访问数据库。但这里始终有一个问题,就是事物的共享问题。Spring的jdbcTemplate和hibernate是分开配置的,没有统一交由一个类来进行管理,如果程序中有两者协同处理,很容易出现事物不能全部回滚的问题。这种担心一直都让我惴惴不安。

 

    有没有一种机制可以让两者共用事物达到理想中的共存呢?查阅文档发现,HibernateTransactionManager真有这种机制,不禁欣喜若狂。

    不使用spring jdbcTemplate时,applicationContext.xml的配置如下:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="lobHandler" ref="oracleLobHandler" />
		<property name="configLocation" value="classpath:hibernate.cfg.xml" />
	</bean>


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

 

 

 

 

 

 

    Hibernate 与spring jdbcTemplate共同操作的配置如下:

 

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
	   <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
	   <property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.0.7:1521:ORCL" />
	   <property name="user" value="hb0815" />
	   <property name="password" value="hb0815" />
	   <property name="minPoolSize" value="5" />
   	   <property name="maxPoolSize" value="10"/>   
   	   <property name="initialPoolSize" value="5"/>
	</bean>
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource"><ref bean="dataSource"/></property>
    </bean>
    
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="lobHandler" ref="oracleLobHandler" />
		<property name="configLocation" value="classpath:hibernate.cfg.xml" />
	</bean>

	<context:component-scan base-package="com.hzunitech" />

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

  

相关推荐

Gbug00 / 0评论 2010-10-08