try{
  trans.rollback();
}catch(HibernateException ex){
   ex.printStackTrace();
}

解决方案 »

  1.   

    谢谢啦.可是问题是,有时候我直接在tx.commit()后面加一句tx.rollback()这样子直接回滚也会报错,或者根本没有rollback回去..请问这个是什么原因啊...大侠是确实试过这个代码可以rollback 吗??
      

  2.   

    你commit之后怎么回滚呢??倒,commit就是提交,意味着此次事务处理已经完成....
      

  3.   

    谢谢killme的意见,我也听到有这样的意见,试过将commit去掉或者放在rollback()之后.结果还是一样,退不回去..
      

  4.   

    像这样直接执行,数据库同样没有回滚回去,还请各位大侠给意见啊.. 
    tx = session.beginTransaction();            session.save(userTemp);
                System.out.println("-----------run run Lorra---------");
                 tx.rollback();
                 System.out.println("-----------run run Lorra meme---------");
      

  5.   

    java,Struts,Hibernate,Spring技术论坛群一号群:9967568,如人满请加二号群:4705749。真诚欢迎各位朋友来学习探讨
      

  6.   

    倒,你把commit去掉能插入数据吗??你倒做做让我见识下.
    什么叫rollback?这是为了在你更新数据过程中出错,回滚至更新前的状态,在你未commit之前(或者commit成功之前)都可以进行回滚,而commit是什么意思?提交,当你确认你更新的数据是你所希望的,你可以提交,此时数据库才真正地更新数据,没有commit之前数据都是未变的.我建议你了解下数据库事务处理的一些概念.所以一般的写法是这样:
    try {
                tx = session.beginTransaction();            String strDelete = "delete from User where userNumber='" +
                                   userNumber + "'";
                Query query = session.createQuery(strDelete);
                query.executeUpdate();
                tx.commit();
                session.flush();
                return true;        } catch (HibernateException e)        {
                try{
                tx.rollback();
                return false;
                }
                catch(HibernateException ex){
                ex.printStackTrace();
                }
                
            }
      

  7.   

    killme2008大侠,就我现在正在写的程序来说,没有明示的commit数据也提交成功了..起码这一句是:tx = session.beginTransaction();            session.save(userTemp);
                System.out.println("-----------run run Lorra---------");
                 System.out.println("-----------run run Lorra meme---------");
    //即使这里不用tx.commit()数据已经在数据库了.. 何解??
      

  8.   

    既然在tx.commit()前可以随时rollback()为什么,我rollback()了数据照样已经插入了啊而没有删除.???
      

  9.   

    大侠别走,偶啥也不懂,还请多多指教啊..如果可能的话,随便写一个可以明确进行rollback的例子看看也好啊..到现在为止,好像有几个人和我说过rollback不回去..如果大侠能帮到的话,真的是感激不尽了..
      

  10.   

    你在蒙我吧...你不用commit,竟然可以插入数据,不是你见鬼了,就是我见鬼了...想尝试回滚?简单,人工抛个异常看看:
    session.save(user);

    session.flush();
    throw  new RuntimeException("shit");
    } catch (Exception e) {
    try {
    tran.rollback();
    } catch (HibernateException e2) {
    e2.printStackTrace();
    }
    }
      

  11.   

    次序问题。commit() 和 flush() 的次序。
    rollback() 之前你为什么要 session.clear() ? ;
      

  12.   

    大家不要乱说。误人子弟啊。
    我也刚学hibernate 自己的理解是
    数据库分为显示提交和隐示提交。在开发语言里可设setcommit(boolean)
    我用过别的开发工语言可以达到像楼主那样的想法(正常没人这么写只是为了测试)
    但是hibernate 必须tr.commit;才能提交数据否则不会自动提交的。既然提交了就当然不能
    rollback。异常产生hibernate 会自动rollback也可以手写rollback。(自己的理解不一定对)良好的习惯。
    Student s = new Student();
    s.setId("32543"); //key
    s.setName("sdf");
    Student s1 = new Student();
    s1.setId("32543");//key
    s1.setName("a");
    Session session= HibernateSessionFactory.currentSession();
        Transaction tr = session.beginTransaction();
    try{ session.save(s);
    session.save(s1);  //产生异常。因为key 重复


        tr.commit();
          
    }catch (HibernateException e)        {
               
                tr.rollback(); //可有可无(因为根本就没有commit;对hibernate 的rollback 我也不太明白。请大家指教啊)
                
                }}
      

  13.   

    什么可有可无??倒,楼上的是你在误倒
    在session.save()操作中可能抛出受控异常HibernateException,抛出此异常说明hibernate插入失败,需要回滚.
      

  14.   

    to 楼上的请举个列子吧。
    其实我也就是想知道tr.rollback()如何回滚(我不管数据库那层的事务,回滚。其实我也做了多年的数据库了。现在只是讨论hibernate的rollbacK()
    )我的理解是hibernate 只有commit后才去造作后台数据。在产生异常之前你没有comit;所以在异常里写rollback 的用处我就不明白了。我给你举个列子。我在别的语言里用到的。当然只是我的测试。正常我也不会这样写的commit(true); 
    sql: insert       to   table;
     rollback;//如过我写上 这句数据是不会插入的。因为回滚了。
    如过不写这句就回插入数据。。
    请举个hibernate rollback 的列子吧
      

  15.   

    请注意,hibernate是禁止立即自动提交事务的.
    下面是hibernate文档里面的原话:一个hibernate抛出的异常意味着你必须立即回滚数据库事务,并立即关闭session.如果你的session绑定到一个应用程序上,你必须立即停止该应用程序.回滚数据库事务并不会把你的业务对象退回到事务启动时的状态,这意味着数据库状态和业务对象状态不同步.通常情况下这不是什么问题,因为异常是不可恢复的,你必须在回滚之后重新开始执行.我对数据库事务的了解不深入,我的理解是,在产生异常时,hibernate是不会自动回滚的,回滚的操作必须由你自己来完成.在老版本中HibernateException是个受控异常,在hiberante3中却是一个非受控异常,处理方式改变了,在3中,我要么抛出到顶层,封装错误消息给用户,要么采用其他的处理手段.
      

  16.   

    在非托管环境中,因为hibernate是禁止立即提交事务,所以说你上面举的例子在hibernate中是无效.当然,一般结合spring,由spring来托管事务处理(开始,提交,回滚).