您的位置:首页 > 编程语言 > Java开发

spring管理hibernat的事务

2016-05-28 16:32 387 查看
在做spring对hibernate进行事务管理的时候遇到这样一个问题,使用hibernat的session.save()方法进行数据插入,始终需要说动commit才可以,耗费了我一个上午的时间,终于把问题找到了:

需要在spring-mvc.xml中增加如下配置:

<!-- 如果不配置这两个,自动事务处理会失败 -->

        <bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="CommonAnnotationBeanPostProcessor" />
<bean id="CommonAnnotationBeanPostProcessor"
class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

说道这里不得不说下spring读事务的管理:事务的实现方式有两种,一种是声明式的事务,一种则是注解式的事务:本次我用的是声明式事务配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=" http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">

<!-- 配置数据源 c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />

<!-- 请求超时时间 -->
<property name="checkoutTimeout" value="30000" />
<!-- 每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 -->
<property name="idleConnectionTestPeriod" value="30" />
<!-- 连接数据库连接池最大空闲时间 -->
<property name="maxIdleTime" value="30" />
<!-- 连接池初始化连接数 -->
<property name="initialPoolSize" value="5" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="100" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 -->
<property name="acquireIncrement" value="5" />
</bean>

<!-- 配置hibernate的SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 注入数据源 相关信息看源码 -->
<property name="dataSource" ref="dataSource" />
<!-- hibernate配置信息 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>

<!-- 开启二级缓存 ehcache -->
<prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.cache.provider_configuration_file_resource_path}
</prop>
</props>
</property>
<!-- 扫描hibernate注解配置的entity -->
<property name="packagesToScan">
<list>
<value>com.supermap.**.model</value>
</list>
</property>
</bean>

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

    <tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置事务增强处理Bean,指定事务管理器 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<!-- 配置详细事务处理语义 -->
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="load*" propagation="SUPPORTS" read-only="true" />
<!-- 其他采用默认事务方式 --
4000
>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- Spring aop事务管理 -->
<aop:config expose-proxy="true" proxy-target-class="true" >
<!-- 配置切入点 -->
<!-- <aop:pointcut id="transactionPointcut"
expression="execution(* com.supermap.jointclient.web.*Controller.*(..))||
execution(* com.supermap.jointclient.service.impl.*Impl.*(..))" /> -->
<aop:pointcut id="transactionPointcut"
expression="execution(* com.supermap.jointclient.web.*Controller.*(..))||
execution(* com.supermap.jointclient.service.impl.*Impl.*(..))"  />
<!-- 指定在txAdvice切入点应用txAdvice事务增强处理 -->
<aop:advisor pointcut-ref="transactionPointcut"
advice-ref="transactionAdvice" />
</aop:config>

</beans>

sprng 默认的事务处理方法是什么样的呢? 默认是REQUIRED。 

propagation有七种配置,REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。默认是REQUIRED。 
2.七种配置的意思 
下面是Spring中Propagation类的事务属性详解: 
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。 
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。 
3.注意. 
这个配置将影响数据存储,必须根据情况选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: