Spring4和Hibernate4整合后事务不起作用
2017-11-30 21:15
302 查看
当 Spring4 和 Hibernate4 整合后,事务不起作用
解决办法:通过Spring的SessionFactory的getCurrentSession的方法创建Session一、首先说一下hibernate中创建用来连接数据库的Session,有两种方式。
通过Spring的SessionFactory的getCurrentSession的方法创建Session 。通过Spring的SessionFactory的OpenSession的方法创建Session。
getCurrentSession 创建的Session会绑定到当前线程中去,commit或rollback后会,自动关闭Session。
OpenSession 重新开启一个线程创建Session,需要手动关闭Session,如果不关闭将导致session关联的数据库连接无法释放,最后资源耗尽而使程序当掉。
二、而当Hibernate利用Spring中的绑定事务来配置的时候如下图:
<context:component-scan base-package="com.tiakon.note.spring.dao"/> <context:component-scan base-package="com.tiakon.note.spring.service"/> <!--1.配置数据源--> <!--1.1导入资源文件--> <context:property-placeholder location="classpath:db.properties"/> <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/> <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/> </bean> <!--2.配置Hibernate的SessionFactory 实例:通过Spring提供的:LocalSessionFactoryBean进行配置--> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!--2.1配置数据源属性--> <property name="dataSource" ref="comboPooledDataSource"/> <!--2.2配置hibernate配置文件的位置及名称--> <property name="configLocation" value="classpath:hibernate.cfg.xml"/> <!--2.3配置hibernate映射文件的位置及名称,可以使用通配符--> <property name="mappingResources"> <list> <value>HiAccountEntity.hbm.xml</value> <value>HiBookEntity.hbm.xml</value> </list> </property> </bean> <!--3.配置Spring声明式事务--> <!--3.1配置事务管理器--> <bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!--3.2配置事务属性,需要事务管理器--> <tx:advice transaction-manager="hibernateTransactionManager" id="transactionInterceptor"> <tx:attributes> <!--<tx:method name="purchase" propagation="REQUIRED"/>--> <tx:method name="get*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <!--3.3配置事务切点,并把切点和事务属性关联起来--> <aop:config> <aop:pointcut id="txPointcut" expression="execution(* com.tiakon.note.spring.service.*.*(..))"/> <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="txPointcut"/> </aop:config>
配置事务是,需要将数据库中的数据源,注入 HibernateTransactionManager可以说,事务的配置是,针对于数据库来说的。(我是这么理解的)
所以,当我们采用OpenSession来创建Session来连接数据库的话,和事务连接数据库是两个线程的操作,所以事务根本不会起作用。
应该采用getCurrentSession进行session的创建。
相关文章推荐
- Mybatis整合Spring3,事务注解为何不起作用的解决办法
- hibernate4整合spring3事务问题
- spring-hibernate整合 事务不起作用
- Spring+Mybatis整合事务不起作用之解决方案汇总
- Spring+Mybatis整合事务不起作用之…
- 关于Spring4+Hibernate4架构升级-整合的细节处理-由nested transactions not supported错误解决引申到事务嵌套问题处理
- Spring4+Hibernate4整合经验:事务配置导致的java.lang.NoSuchMethodError异常
- spring,springmvc,hibernate整合事务不起作用
- hibernate4整合spring3事务问题
- springmvc+spring3.1+hibernate4配置事务不起作用
- Spring+Mybatis整合事务不起作用之解决方案汇总
- spring整合hibernate事务管理的四种方式,以及事务的传播行为和隔离级别介绍
- spring与mybatis整合及事务控制
- Spring+SpringMVC+mybatis+easyui整合实例-----spring mvc整合及mybatis事务部分
- struts2+Hibernate4+spring3+EasyUI环境搭建之三:引入sututs2以及spring与sututs2整合
- spring整合 mybatis 事务管理不生效原因
- Spring整合Hibernate 二 - 声明式的事务管理
- spring hibernate整合时配置文件的事务部分(spring管理事务)
- spring 事务管理不起作用原因分析与解决
- spring与mybatis整合及事务控制