解决方案 »

  1.   

    你的userService bean需要引入sqlMapClient吧
      

  2.   


    我的userService bean继承了BaseService
    BaseService的声明:BaseService<T> extends SqlMapClientTemplate
      

  3.   


    <bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory" />
    <!-- 配置事务,采用接口代理来管理事务,须在Service实现中以 @Transactional标注来定义启用事务 -->
    <!-- 默认情况下自动使用transactionManager -->
    <tx:annotation-driven transaction-manager="txManager" />
    你用注解事务代替你的配置事务。<context:component-scan base-package="com.suneee" />这个只配置一次就可以了
      

  4.   

    spring-mvc里面的自动扫描只需要扫描service层,楼主查看下你写的方法 是不是insert update delete开头。其他事务配置没看到赔错的地方。
      

  5.   

    你的UserService 上面加了@Service("userService")没啊
      

  6.   

    userService 代码;
    @Transactional(rollbackFor=Exception.class)//如果发生Exception异常了,就进行回滚
    @Service("userService")
    public class UserService extends BaseService<User> implements IUserService{ @Override
    public List<User> findUser(User user) {
    return   queryForList("user_queryAll",user);
    } @Override
    public User insert(User user){
     
      insert("user_insert",user);
     
      user = null;//故意设置为null,抛出异常  
      insert("user_inserts",user);

    return user;
    }}
      

  7.   

    配置启动的错误,我已经调好了,是因为我没有配置注入sqlMapClient,
    现在就是同一个方法,第二次插入数据报错后,第一条插入的数据不能回滚
      

  8.   

     java类中把@Transactional注解去掉试试
      

  9.   


    贴一贴你的baseService吧,你的错误就表明userService bean需要引入sqlMapClient
      

  10.   


    贴一贴你的baseService吧,你的错误就表明userService bean需要引入sqlMapClient这个错误我解决了,通过在applicationContext.xml文件头上写default-autowire="byName"   解决了现在是事务不能回滚的问题
      

  11.   

    BaseService代码:
    package com.suneee.service.base;import java.sql.SQLException;
    import java.util.List;import org.springframework.orm.ibatis.SqlMapClientTemplate; 
    public class BaseService<T> extends SqlMapClientTemplate{
    public static final int PAGE_SIZE = 15; public Object insert(String sqlId,Object baseClass){
    Object baseClassResult = null;
    try {
    baseClassResult = (Object) super.getSqlMapClient().insert(sqlId,baseClass);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return baseClassResult;
    }

    public Object queryForObject(String sqlId,Object baseClass){
    Object baseClassResult = null;
    try {
    baseClassResult = (Object) super.getSqlMapClient().queryForObject(sqlId,baseClass);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return baseClassResult;
    }

    public Integer delete(String sqlId,Integer id){
    Integer number = null;
    try {
    number = super.getSqlMapClient().delete(sqlId, id);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return number;
    }

    public Integer deleteByObject(String sqlId,Object obj){
    Integer number = null;
    try {
    number = super.getSqlMapClient().delete(sqlId, obj);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return number;
    }

    public Object queryById(String sqlId,Integer id){
    Object baseClassResult = null;
    try {
    baseClassResult = (Object) super.getSqlMapClient().queryForObject(sqlId,id);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return baseClassResult;
    }


    public List<Object> queryListByPage(String sqlId,Object obj){
    List<Object> list = null;
    try {
    list = (List<Object>) super.getSqlMapClient().queryForList(sqlId, obj);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return list;
    }

    public List<Object> queryListNoPage(String sqlId,Object obj){
    List<Object> list = null;
    try {
    list = (List<Object>) super.getSqlMapClient().queryForList(sqlId, obj);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return list;
    }

    public int update(String sqlId,Object obj){
    Integer number = null;
    try {
    number = super.getSqlMapClient().update(sqlId, obj);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return number;
    }

     

    //批量入库
    public boolean insertBatch(String sqlId,List list){
    Object obj = null;
    try {
    super.getSqlMapClient().startBatch();
    for(int i=0; i<list.size(); i++){
    obj = list.get(i);
    super.getSqlMapClient().insert(sqlId,obj);
    }
    super.getSqlMapClient().executeBatch();
    return true;
    } catch (SQLException e) {
    e.printStackTrace();
    return false;
    }
    }


    public int getCount(String sqlId){
    Integer i = null;
    try {
    i =  (Integer) super.getSqlMapClient().queryForObject(sqlId);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return i;
    }

    }
      

  12.   

    我修改了insert方法,在里面把异常直接抛出就可以了,我想问下,只有这样事务才能回滚吗?异常不是spring自动去捕捉的吗@Override
    public void insert(User user){
      
      insert("user_insert",user);
     
      user = null;//故意设置为null,抛出异常  
      insert("user_inserts",user);
      throw new RuntimeException();

    }