环境 : MySql操作 : 批量新增要求 : 如果其中一笔数据出现错误,掠过这一笔,继续新增下一笔数据。
        例 : 共有 5 笔数据,其中第3笔出现错误,不能新增到DB, 那么继续处理后面的 2 笔,最后新增到DB中的数据
              应该有 4 笔(第1,2,4,5笔)。使用以下代码,最后DB中一笔数据也没有
// method startTransaction tx = this.session.beginTransaction();

for (int i = 0; i < list.size(); i++) {
    try {
        this.session.saveOrUpdate(list.get(i));
    }
    catch (HibernateException e) {    }
}tx.commit();// method end
后又改了一下代码,还是不行。出错那笔数据以前新增的,可以成功,但是以后的全都不能新增
即 : 共有 5 笔, 第 3 笔出错,DB 中只能新增第1,2笔,第3,4,5笔都不行// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();

this.session.saveOrUpdate(list.get(i)); tx.commit();
}
catch (HibernateException e) {
// ~~~
}
}
// method end
那位大侠可以解决,不胜感激!

解决方案 »

  1.   

    this.session.saveOrUpdate(list.get(i));你为何不把这一行放到一个单独的try/catch里面呢。这样除了异常,就不至于退出循环了!
      

  2.   

    你那个list是可以批量更新的,这样做你累不累。
    还有,你后改的那个方法极不可取,自己玩玩还可以。
      

  3.   


    不用 sorry, 你帮我想个办法就行了, 哈~
      

  4.   

    不熟,N长时间没Hibernate了,也没有环境测试。但是,我建议你第二种的时候,加个finally把tx关掉,并置为null,再试试。否则,你的this.session一直是出错状态。我猜的
      

  5.   

    ???
    抛出异常后,并catch后,程序不就在抛出的点终止了么?
      

  6.   

    出错之后,当前事务既没提交也没回滚,数据库一直等待超时,你可以这么修改// method start
    for (int i = 0; i < list.size(); i++) {
        try {
            Transaction tx = this.session.beginTransaction();
                            
            this.session.saveOrUpdate(list.get(i));        tx.commit();
        }
        catch (HibernateException e) {
            tx.rollback();
            // ~~~
        }
    }
    // method en
      

  7.   

    开启5个事务,每笔数据都不会影响,LZ想想行的通不?
    如果交给SPRING控制事务,那就简单多了
      

  8.   


    如果异常被 Catch 住,则 Catch 以后的代码依然会执行,但是从出错点到Catch之间的代码不会执行。
    就此代码而言,异常被Catch住后,会继续执行 Catch 一下的代码,但是 Catch 一下已经没有代码了,
    所以会继续执行下一次循环。
      

  9.   


    Transaction tx = session.getTransaction();
    for (int i = 0; i < list.size(); i++) {
        try {
            tx.begin();
                            
            this.session.saveOrUpdate(list.get(i));        tx.commit();
        }
        catch (HibernateException e) {
            tx.rollback();
        }
        finally{
            tx = session.getTransaction();
        }
    }不知道行不行
      

  10.   

    for (int i = 0; i < list.size(); i++) {
        try {
            this.session.saveOrUpdate(list.get(i));
            tx.commit();//如果不用这句话要把session变成自动提交
        }
        catch (HibernateException e) {    }
    }
      

  11.   

    for (int i = 0; i < list.size(); i++) { 
        try { 
            this.session.saveOrUpdate(list.get(i)); 
            tx.commit();//如果不用这句话要把session变成自动提交 
        } 
        catch (HibernateException e) {     } 
    } 你的问题似乎和事务没有关系。把事务去掉试试。
    因为你这个批处理不要保证数据的事务的原子性(当有一条记录错误时,直接过,接着往下走)。
      

  12.   

    // method start
    for (int i = 0; i < list.size(); i++) {
        try {
            Transaction tx = this.session.beginTransaction();
                            
            this.session.saveOrUpdate(list.get(i));        tx.commit();
        }
        catch (HibernateException e) {
            if(tx!=null){
              tx.rollback();
            }
            // ~~~
        }finally{
            if(session!=null){
               session.close();
             }
        }
    }
    // method en
    看看这样行不