问题描述
请教下大家,使用Spirng+hibernat进行事物管理,无法控制,我在service层进行事物控制,模拟条出错信息,但是不会回滚事物代码如下:applicationContext.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:jee="http://www.springframework.org/schema/jee"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-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/jeehttp://www.springframework.org/schema/jee/spring-jee-3.0.xsd"default-autowire="byName"><context:component-scanbase-package="*"></context:component-scan><beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"><propertyname="driverClass"value="com.mysql.jdbc.Driver"></property><propertyname="jdbcUrl"value="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8"></property><propertyname="user"value="root"></property><propertyname="password"value="123456"></property></bean><beanid="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><propertyname="dataSource"><refbean="dataSource"/></property><propertyname="hibernateProperties"><props><propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><propkey="hibernate.show_sql">true</prop><propkey="hibernate.format_sql">true</prop><propkey=""></prop></props></property><propertyname="mappingResources"><list><value>com/frd/entity/model/User.hbm.xml</value></list></property></bean><beanid="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"><!--<propertyname="dataSource"ref="dataSource"></property>--><propertyname="sessionFactory"ref="sessionFactory"></property></bean><!--<tx:annotation-driventransaction-manager="transactionManager"/>--><!--事物的处理(事物管理器、事物的传播行为)--><tx:adviceid="testAdvice"transaction-manager="transactionManager"><tx:attributes><tx:methodname="*"propagation="REQUIRED"/></tx:attributes></tx:advice><aop:config><!--事物切入点--><aop:pointcutid="testPointcut"expression="execution(*com.frd.service.impl.*.*(..))"/><!--指定事物切入点,使用事物的处理--><aop:advisorpointcut-ref="testPointcut"advice-ref="testAdvice"/></aop:config></beans>
dao实现类packagecom.frd.dao.impl;importjava.util.List;importjavax.annotation.Resource;importjavax.print.attribute.standard.Finishings;importorg.hibernate.Query;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.Transaction;importorg.springframework.stereotype.Repository;importcom.frd.dao.UserDao;importcom.frd.entity.model.User;@RepositorypublicclassUserDaoImplimplementsUserDao{@ResourceprivateSessionFactorysessionFactory;@OverridepublicvoidaddUser(Useruser)throwsException{sessionFactory.getCurrentSession().save(user);}@OverridepublicList<User>getAllUser()throwsException{Stringhql="fromUser";Queryquery=sessionFactory.getCurrentSession().createQuery(hql);returnquery.list();}@OverridepublicvoiddelUser(intuserid)throwsException{Sessionsession=sessionFactory.getCurrentSession();session.delete(session.get(User.class,userid));session.flush();}@OverridepublicUsergetUser(intuserid)throwsException{Stringhql="fromUseruwhereu.id=?";Queryquery=sessionFactory.getCurrentSession().createQuery(hql);query.setInteger(0,userid);return(User)query.uniqueResult();}@Overridepublicvoidupdate(Useruser)throwsException{Stringhql="updateUserusetu.username=?,u.password=?whereu.id=?";Queryquery=sessionFactory.getCurrentSession().createQuery(hql);query.setString(0,user.getUsername());query.setString(1,user.getPassword());query.setInteger(2,user.getId());intret=query.executeUpdate();}}
service实现类packagecom.frd.service.impl;importjava.util.List;importjavax.annotation.Resource;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importcom.frd.dao.UserDao;importcom.frd.entity.model.User;importcom.frd.service.Userservice;@ServicepublicclassUserserviceImplimplementsUserservice{@ResourceprivateUserDaouserdao;@OverridepublicvoiddelUser(intid)throwsException{//null用户ID主键,由数据库自动生成userdao.addUser(newUser(null,"abc","abc"));id=1000;userdao.delUser(id);}
我模拟了个环境,在删除方法中先添加个用户,然后删除id为1000的用户信息(数据库中不存在ID为1000的用户),这时候删除报异常,可是还是把用户添加进去了不会回滚,找了很久不知道哪里错了,请大家指教下,谢谢~
解决方案
解决方案二:
没人知道吗?
解决方案三:
你的配置文件里没有指定rollback-for="Exception"(这句不指定,默认就是抛RuntieException,但你的是Exception,故加上配置)另外,Mysql库有一种ISAM库模式不支持事务!要用innoDB