解决方案 »

  1.   

    上面的那段代码 是我为了 在最底层捕获异常加的, 那个save是我封装了下  Hibernate的save方法,没有做任何处理的,同样捕获不到
      

  2.   


    确定没进 catch里面去 直接逃过了 
      

  3.   


    没看懂你的意思。 先查——判断——插入不是正常的么?
    是的,一般的话 这个业务顺序是正常的,那为什么我在service的异常捕获不到,反而在我service的外层Controller层可以捕获到,这个不明白为什么
      

  4.   

    你try catch写到service中怎么可能补货不到,你service的代码里面又try catch吗
      

  5.   

    没有的,在我service调用的那个save方法就是封装的hibernate的了,不知道为啥 在service层捕获不到,但是在service的外层也就是action层可以捕获到。
    网上说 是spring把 SqlException 转换成了DataAccessException, 但是只能在service的外层可以捕获到 不知道为啥??请您看下:http://bbs.csdn.net/topics/390050093?page=1#post-398522654
    这个是网上之前的一个论坛,也是说这个问题的   请您看下,可能是我没说清楚
      

  6.   

    按你所描述的,应该是在service层事物没有提交,所以,延迟到COntrol层才报错,你检查下你事物配置。你可以手动提交先验证下,再做修改;
      

  7.   

    你service里面没有try catch当然捕获不到了,你都是直接调用方法下去的,异常又没在service里面捕获,都是直接往上层抛出去的如果你在你的service.save方法里面做try catch肯定能捕获到的
      

  8.   


    其实我的这个方法就是在service层做的,只不过是调用了balanceSourceService里面的方法
    try {
    balanceSourceService.save(source);
    }catch(DataAccessException e){
    System.out.println("service=================================");
    e.printStackTrace();

    不过他执行到这里 就会直接逃过去,到上面的controller才报出异常 ,就行这里面说的 http://bbs.csdn.net/topics/390050093?page=1#post-398522654
      

  9.   


    其实我的这个方法就是在service层做的,只不过是调用了balanceSourceService里面的方法
    try {
    balanceSourceService.save(source);
    }catch(DataAccessException e){
    System.out.println("service=================================");
    e.printStackTrace();

    不过他执行到这里 就会直接逃过去,到上面的controller才报出异常 ,就行这里面说的 http://bbs.csdn.net/topics/390050093?page=1#post-398522654
    你只是捕获DataAccessException类型的异常,他抛的不是这种的异常你当然捕获不到了,你改成catch(Exception e)
      

  10.   


    我使用注解在 service层的方法 上加@Transactional  做的的事务,这样在service事务还提交不了?我对spring的理解不够深,我以为把这个注解加在哪个方法上,事务就控制到这个层了呢  
      

  11.   


    其实我的这个方法就是在service层做的,只不过是调用了balanceSourceService里面的方法
    try {
    balanceSourceService.save(source);
    }catch(DataAccessException e){
    System.out.println("service=================================");
    e.printStackTrace();

    不过他执行到这里 就会直接逃过去,到上面的controller才报出异常 ,就行这里面说的 http://bbs.csdn.net/topics/390050093?page=1#post-398522654
    你只是捕获DataAccessException类型的异常,他抛的不是这种的异常你当然捕获不到了,你改成catch(Exception e)DataAccessException e这个异常是 spring把SqlException异常转化过来的,报错是唯一索引冲突,所以底层就是SqlException,但是Spring会把他转为DataAccessException 异常,我之前是写的 Exception的  效果是一样
      

  12.   

    你catch(Exception e)的怎么可能捕获不到,除非你balanceSourceService.save方法里面又自己try catch了
      

  13.   

    你catch(Exception e)的怎么可能捕获不到,除非你balanceSourceService.save方法里面又自己try catch了确实是捕获不到,我就在疑惑这个问题 ,http://bbs.csdn.net/topics/390050093?page=1#post-398522654这个论坛也是在说这个问题,最后也灭出来答案,;;刚才 11楼这样说的 ,我在试试:按你所描述的,应该是在service层事物没有提交,所以,延迟到COntrol层才报错,你检查下你事物配置。你可以手动提交先验证下,再做修改;
      

  14.   

    你catch(Exception e)的怎么可能捕获不到,除非你balanceSourceService.save方法里面又自己try catch了确实是捕获不到,我就在疑惑这个问题 ,http://bbs.csdn.net/topics/390050093?page=1#post-398522654这个论坛也是在说这个问题,最后也灭出来答案,;;刚才 11楼这样说的 ,我在试试:按你所描述的,应该是在service层事物没有提交,所以,延迟到COntrol层才报错,你检查下你事物配置。你可以手动提交先验证下,再做修改;
    楼主是service里面又调用了balanceSourceService.save是吧,那你这个service上是不是已经有事务了如果有,那么balanceSourceService.save上是不是也有事务标识,如果balanceSourceService.save上也有事务标识而调用balanceSourceService.save的service的方法上也有事务标识的话,那么这个事务事务的传播方式如果balanceSourceService.save不是Propagation.REQUIRES_NEW的话就会出现这个问题,因为不新开一个事务的话,两个都是用同一个事务,balanceSourceService.save方法运行完成了,是不会提交的,只有上层的service调用成功后才会提交的,而你这个索引的异常是要事务提交到数据库才会出现的,所以你才捕获不到,如果你balanceSourceService.save方法上的事务传播改为Propagation.REQUIRES_NEW的话就能捕获到了
      

  15.   

    你catch(Exception e)的怎么可能捕获不到,除非你balanceSourceService.save方法里面又自己try catch了确实是捕获不到,我就在疑惑这个问题 ,http://bbs.csdn.net/topics/390050093?page=1#post-398522654这个论坛也是在说这个问题,最后也灭出来答案,;;刚才 11楼这样说的 ,我在试试:按你所描述的,应该是在service层事物没有提交,所以,延迟到COntrol层才报错,你检查下你事物配置。你可以手动提交先验证下,再做修改;
    楼主是service里面又调用了balanceSourceService.save是吧,那你这个service上是不是已经有事务了如果有,那么balanceSourceService.save上是不是也有事务标识,如果balanceSourceService.save上也有事务标识而调用balanceSourceService.save的service的方法上也有事务标识的话,那么这个事务事务的传播方式如果balanceSourceService.save不是Propagation.REQUIRES_NEW的话就会出现这个问题,因为不新开一个事务的话,两个都是用同一个事务,balanceSourceService.save方法运行完成了,是不会提交的,只有上层的service调用成功后才会提交的,而你这个索引的异常是要事务提交到数据库才会出现的,所以你才捕获不到,如果你balanceSourceService.save方法上的事务传播改为Propagation.REQUIRES_NEW的话就能捕获到了
    您说的这个点我都没考虑到,确实是会出现这样的情况的 ,我在事务上的控制是在放在方法上的 ,没有在类上做事务的控制,目前是只有在service的那个方法上加的有事务如下所示: public class BalanceInterfaceImpl{

    @Transactional
    public void payFees(){
    ....
    ....
    balanceSourceService.save(source);
    }
    }balanceSourceService.save(source)这是另外一个类中的方法,并且这个方法我没有去手动的在方法上加事务,您说这是几个事务,我理解的只有一个(对事务的原理理解的不是很好),请指点!!谢谢您了
      

  16.   

    你catch(Exception e)的怎么可能捕获不到,除非你balanceSourceService.save方法里面又自己try catch了确实是捕获不到,我就在疑惑这个问题 ,http://bbs.csdn.net/topics/390050093?page=1#post-398522654这个论坛也是在说这个问题,最后也灭出来答案,;;刚才 11楼这样说的 ,我在试试:按你所描述的,应该是在service层事物没有提交,所以,延迟到COntrol层才报错,你检查下你事物配置。你可以手动提交先验证下,再做修改;
    楼主是service里面又调用了balanceSourceService.save是吧,那你这个service上是不是已经有事务了如果有,那么balanceSourceService.save上是不是也有事务标识,如果balanceSourceService.save上也有事务标识而调用balanceSourceService.save的service的方法上也有事务标识的话,那么这个事务事务的传播方式如果balanceSourceService.save不是Propagation.REQUIRES_NEW的话就会出现这个问题,因为不新开一个事务的话,两个都是用同一个事务,balanceSourceService.save方法运行完成了,是不会提交的,只有上层的service调用成功后才会提交的,而你这个索引的异常是要事务提交到数据库才会出现的,所以你才捕获不到,如果你balanceSourceService.save方法上的事务传播改为Propagation.REQUIRES_NEW的话就能捕获到了
    额,我大概明白点了,但是问题会又出来了,假如我balanceSourceService.save使用REQUIRES_NEW这种事务传播方式,那么当balanceSourceService.save成功提交但是在上层的service方法中有异常了 需要回滚  此时我balanceSourceService.save的事务已提交是回滚不了的了
      

  17.   

    try {
                balanceSourceService.save(source);
            }catch (Exception e) {
                e.printStackTrace();
            } 这段代码中 事物是在哪 在Service上还是在你这个方法这边?
    如果你的事物没在save的时候提交 那么就不会报错
    你那个错是事物提交的时候才报错的
    如果你save没提交事物
    你这里确实捕获不到异常吧
      

  18.   

    你这个 唯一索引、是主键、有事索引是吗?要是的话、你先把唯一索引的条件去掉、 看能否、save成功?  我怀疑是唯一索引的问题、 
      

  19.   

    你的事务在service层没有commit,所以只能在上一层处理