问题描述
配置文件:<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!--定义数据库连接池数据源bean,该数据源连接的是mysql数据库,并设置数据库的URL、用户名和密码destroy-method="close"的作用是当数据库连接不适用的时候,就该把连接重新放到数据池中,方便下次使用调用。--><beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><propertyname="driverClass"value="com.mysql.jdbc.Driver"></property><propertyname="jdbcUrl"value="jdbc:mysql://${jdbc.host}:${jdbc.port}/${jdbc.database}?useUnicode=true&characterEncoding=UTF-8"></property><propertyname="user"value="${jdbc.user}"></property><propertyname="password"value="${jdbc.password}"></property><!--添加c3p0连接池--><!--初始化连接池中的连接数,取值应该在minPoolSize和maxPoolSize之间--><propertyname="initialPoolSize"value="2"/><!--连接池中保留的最小连接数--><propertyname="minPoolSize"value="1"/><!--连接池中保留的最大连接数--><propertyname="maxPoolSize"value="100"/><!--当连接池中的连接耗尽的时候c3p0一次同时获得的连接数--><propertyname="acquireIncrement"value="5"/><!--最大空闲时间,60秒内未使用的连接则被丢弃。若0则永不丢弃。默认值为0<propertyname="maxIdleTime"value="60"/>--><!--c3p0是异步操作的,缓慢的JDBC操作通过帮助线程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作被同时执行--><propertyname="numHelperThreads"value="3"/><!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量,但由于缓存的statement属于单个connection而不属于整个连接数池,所以设置这个参数需要考虑到多方面的因素--><propertyname="maxStatements"value="100"/></bean><!--配置sessionFactory,依赖注入上面的dataSource数据源--><beanid="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><!--注册实体类模型注解--><propertyname="packagesToScan"value="sh.entity"/><propertyname="hibernateProperties"><props><!--针对MySQL数据库的方言,特定的关系数据库生成优化的SQL--><propkey="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop><!--hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。--><propkey="hibernate.hbm2ddl.auto">update</prop><!--是否在控制台打印sql语句--><propkey="hibernate.show_sql">true</prop><!--输出格式化后的sql,更方便查看--><propkey="hiberante.format_sql">true</prop></props></property></bean><!--定义事务管理器(声明式的事务)--><beanid="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"><propertyname="sessionFactory"ref="sessionFactory"/></bean><tx:adviceid="txAdvice"transaction-manager="transactionManager"><tx:attributes><tx:methodname="delete*"propagation="REQUIRED"/><tx:methodname="update*"propagation="REQUIRED"/><tx:methodname="add*"propagation="REQUIRED"/><tx:methodname="*"read-only="true"/></tx:attributes></tx:advice><aop:config><aop:pointcutid="interceptorPointCuts"expression="execution(*sh.service.*.*(..))"/><aop:advisoradvice-ref="txAdvice"pointcut-ref="interceptorPointCuts"/></aop:config></beans>模板类中的方法:@Overridepublicvoidupdate(Serializableid){System.out.println("调用update方法中的id:"+id);Tt=this.get(id);System.out.println(t);//调用get方法返回对应id的对象Tif(t!=null){//如果对象t存在,就更新对象getSession().update(t);//getSession().flush();System.out.println("update之后再输出t:"+t);System.out.println("调用完成update方法");}}@Overridepublicvoiddelete(Serializableid){Tt=this.get(id);if(t!=null){getSession().delete(t);//getSession().flush();}}在测试delete和update方法时,id能够到方法里面,方法也执行了,但是就是没效果,如果在方法后面加上flush()方法就有效果,但是add方法不用加就有效果
解决方案
解决方案二:
看你的配置的意思实在servise层加了事务,注意一下几点1:事务加的层对不?2:事务默认回归runtime异常,你是否在dao层或service层把异常处理掉了,没有抛出事务就不起作用了<tx:methodname="add*"propagation="REQUIRED"/>改成<tx:methodname="add*"propagation="REQUIRED"rollback-for="Exception"/>就会拦截所有异常
解决方案三:
估计是你方法执行了,sql事务没提交,你可以配置一下,打出sql看看,是否执行了update语句