0 0

Hibernate4+spring3.2整合事物问题0

首先描述下环境,使用spring3.2MVC+hibernate 4.2.1

问题:事务不提交,session不关闭
测试过程:
1、使用openSession(),手动开启事物,关闭事物没问题
2、使用getCurrentSession(),单元测试没问题,集成之后事务回滚
声明:代码逻辑没有错误。

单元测试父类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/spring-*.xml" })
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback = false)//true:始终回滚 false:数据提交
@Transactional
public class SpringTest {

}

web.xml的OpenSessionInViewFilter
<filter> 
		<filter-name>lazyLoadingFilter</filter-name>  
		<filter-class> org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> 
		<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
		<init-param>  
			<param-name>singleSession</param-name>  
			<param-value>true</param-value>  
		</init-param>
		<init-param>  
			<param-name>sessionFactoryBeanName</param-name>  
			<param-value>sessionFactory</param-value>  
		</init-param>   
		<init-param>  
			<param-name>flushMode</param-name>  
			<param-value>AUTO</param-value>  
		</init-param>  
	</filter>  
	
	<filter-mapping>  
		<filter-name>lazyLoadingFilter</filter-name>  
		<url-pattern>/*</url-pattern>  
	</filter-mapping>


事物配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />     
		<property name="packagesToScan">
			<list>  
				<value>com.ld.car.*.entity</value>  
			</list> 
		</property>  
		<property name="hibernateProperties">         
			<props>          
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>          
				<prop key="hibernate.show_sql">false</prop>  
			</props>     
		</property> 
	</bean>

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
		<property name="dataSource" ref="dataSource"></property>  
	</bean>
	
	<!-- 配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
		<property name="sessionFactory" ref="sessionFactory"/>  
	</bean> 

	<tx:advice id="txAdvice" transaction-manager="transactionManager">  
		<tx:attributes>  
			<!-- 方法对应的传播属性 -->  
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="remove*" propagation="REQUIRED" />
			<tx:method name="load*" propagation="REQUIRED"/>
			<tx:method name="query*" propagation="REQUIRED"/>
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="get*" propagation="REQUIRED" />
			<tx:method name="count*" propagation="REQUIRED"/>
			<tx:method name="find*" propagation="REQUIRED" />
			<tx:method name="list*" propagation="REQUIRED"/>
			<!--<tx:method name="*" propagation="REQUIRED" />-->
		</tx:attributes>  
	</tx:advice>
	
	<!-- 事务控制位置,一般在业务层service -->
	<aop:config>  
		<aop:pointcut id="txPointcut" expression="execution(* *..service.impl.*.*(..)))" />  
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
	</aop:config>
	
	<!--在*ServiceImpl里写@Transactional就可以启用事物管理 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>



2014年12月12日 18:06

1个答案 按时间排序 按投票排序

0 0

可以看看这个demo
http://www.itjavaer.com/article/22
我估计是你的execution有问题aop没有切到

2014年12月17日 14:13

相关推荐

Global site tag (gtag.js) - Google Analytics