Hibernate3中,使用session.save(o)提交数据,怎么知道该动作是否执行成功呢,比如插入的数据主键冲突?
可以通过什么方法获取到出错信息?delete、update同上

解决方案 »

  1.   

    try{
        save
        delete
        update
    }
    catch(Exception e){
    }
      

  2.   

    try catch我试过,并不能捕捉到这一类的问题,在底层的确会跑出这个异常,但在框架里面已经被处理掉了,在外面并不能被捕捉到。
      

  3.   

    方法里边写try catch
    并定义返回类型比如
    boolean returnFlag = false;
    如果没有发生异常,在insert, update, delete语句后修改返回标志为true
    (getHibernateTemple().save()/update()/delete();
    returnFlag = true;)
    如果发生异常,返回类型并不改变
    最后返回定义的返回类型
    就可以知道有没有异常发生了
      

  4.   

    public Serializable save(Object object) throws HibernateException;没出异常就成功了。因为你用了spring的集成包,public Serializable save(final Object entity) throws DataAccessException异常体系根本不同,但是集成包中的异常最终是运行时异常为父类,是可终结的,正好是默认事务处理异常可接受的。你即是用try catch 也一样不能处理底层异常体系,除非你不用那些集成包。出异常你就应该按照错误来处理。有时间可以反射替换代理类。
      

  5.   

    哦,我这到不知道是不是Spring集成包,似乎不是,应为我的方法是
        public Serializable save(Object object) throws HibernateException;
    但是Hibernate框架自己捕捉了异常,save本身并不跑出,异常轨迹如下:Hibernate: insert into Test (UserName, Des, UserCode) values (?, ?, ?)
    Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
    at com.hb.SubmitSchema.closeTransction(SubmitSchema.java:86)
    at com.hb.SubmitSchema.submit(SubmitSchema.java:56)
    at com.hb.FirstClass.main(FirstClass.java:102)
    Caused by: java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件 (LISDEV.PK_TEST) at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459)
    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:4337)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
    ... 10 more
      

  6.   


    boolean bo = false;
    try{ 
        save 
        delete 
        update 
        bo = true;

    catch(Exception e){ 
    bo = false;
    }
    如果bo = true;就成功了。如果=false说明错误,有异常。
      

  7.   

    哎!!那我就在说一次你的那个跟
    public Serializable save(Object object) throws HibernateException;
    public Serializable save(final Object entity) throws DataAccessException 
    这个两个异常不是一个体系。java.sql.BatchUpdateException属于检查性异常,编译器强制要求进行处理,你必须写try catch运行期异常不写try catch也一样如此。hibernate将异常进行重新包装了。类似如下:catch(java.sql.SQLException
    ){
     throw new HibernateException(XXXX);
    }}你在外部调用H的方法怎么能捕获SQLException呀。
    异常栈大体结构--》HibernateException在栈顶。
      

  8.   

    ⊙﹏⊙b汗,还是没明白,我的源代码如下,请帮看看要怎么搞,谢谢谢谢:                SessionFactory mSessionFactory = new Configuration()
    .configure("hibernate.cfg.xml").buildSessionFactory(); Session tSession = mSessionFactory.openSession();
    Transaction tTransaction = tSession.beginTransaction();

    UserSchema tUserSchema = new UserSchema();
    tUserSchema.setUserCode("UserCode");
    tUserSchema.setUserName("UserName"); 

    try{
    tSession.save(tUserSchema);
    }catch(Exception ex){
    System.out.println("xxx");
    ex.printStackTrace();
    }

    tTransaction.commit();
    tSession.close();
      

  9.   

            
    jdbc一般这么弄: 
           try{
                tSession.save(tUserSchema);
                 tTransaction.commit();
            }catch(Exception ex){
                tTransaction.rollback();
                System.out.println("xxx");
                ex.printStackTrace();
            }finally{
     ...........close
            }
            
          
      

  10.   

    呵呵,应该把commit也放进try里面的。