论坛首页 Java企业应用论坛

spring最佳实践中的这一段代码

浏览 13887 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-03-10  
 try {
            return session.get(entityClass, id);;
        }
        catch (HibernateException ex); {
            throw SessionFactoryUtils.convertHibernateAccessException(ex);;
        }


其中catch到的Exception,为什么还要转换一下,这样作比直接 ex.printStackTrace() 好在哪里? 都是抛出异常嘛
   发表时间:2005-03-10  
ex.printStackTrace() 只是在控制台打印出异常,并没有向上抛出异常,如果只有这句的话,调用者是不知道有异常发生的。
转换的目的是将HibernateException  (checked Exception)转换成DataAccessException(UnChecked Exception)。
Rod认为数据库异常对调用者都是不可恢复的。UnChecked Exception更合适。
0 请登录后投票
   发表时间:2005-03-10  
还有一个目的把不同的持久化异常统一起来,比如Hibernate和JDBC的异常统一为一个更加有意义的异常体系。
0 请登录后投票
   发表时间:2005-03-10  
Spring的事务管理机制要求对runtime-exception进行回滚处理,所以进行异常转换,保证事务的有效性。
0 请登录后投票
   发表时间:2005-03-10  
楼上1+2+3就是正确答案啊
0 请登录后投票
   发表时间:2005-03-10  
多谢几位,有一点还是不明白
引用
转换的目的是将HibernateException (checked Exception)转换成DataAccessException(UnChecked Exception)。
Rod认为数据库异常对调用者都是不可恢复的。


就是说如果是数据库的 Checked Exception,即使是捕获到了,我们也处理不了,所以就不用程序捕获,(可以少写一些try catch了)而是在Runtime时候由框架抛出并回滚这些异常?

引用

还有一个目的把不同的持久化异常统一起来,比如Hibernate和JDBC的异常统一为一个更加有意义的异常体系。

你说的有意义,是不是说他能把JDBC级别的错误返回码(比如:ORA:1053)转换成有解释的string返回给控制台?
还有文档上说得DataAccessException的一个优点是他的异常是有层次的? 如何解释

引用

Spring的事务管理机制要求对runtime-exception进行回滚处理,所以进行异常转换,保证事务的有效性

如果把unchecked Exception转换成Runtime Exception,事务就能回滚了么,关键是unchecked Exception如何转换为Runtime Exception 的?
0 请登录后投票
   发表时间:2005-03-10  
这个问题问得很好。Spring的DAOException有几个重要的作用:

1、传统的JTA 异常,或者说应用服务事务处理异常都没有一个共同的父类,这样你必须写一堆catch来处理,非常臃肿不堪。而Spring的DAOException有共同的父类,可以解决这个问题。

2、传统的JTA异常或者说应用服务事务处理异常是CheckedException的,你明知无法处理,还不得不捕获,更糟糕的是有人捕获以后不做任何处理,而Spring的DAOException转化为UncheckedException让有能力的处理的程序去处理。

3、Spring的DAOException内部有一个数据库出错代码和DAOException继承类树的对照表,可以把JDBC Driver抛出的、Java应用代码无法直接处理的数据库出错代码字符串转化为Spring的相应类型的DAO异常,这样就可以让你针对相应的数据库异常进行相应的异常处理了。
0 请登录后投票
   发表时间:2005-03-11  
robbin 写道
这个问题问得很好。Spring的DAOException有几个重要的作用:

1、传统的JTA 异常,或者说应用服务事务处理异常都没有一个共同的父类,这样你必须写一堆catch来处理,非常臃肿不堪。而Spring的DAOException有共同的父类,可以解决这个问题。

2、传统的JTA异常或者说应用服务事务处理异常是CheckedException的,你明知无法处理,还不得不捕获,更糟糕的是有人捕获以后不做任何处理,而Spring的DAOException转化为UncheckedException让有能力的处理的程序去处理。

3、Spring的DAOException内部有一个数据库出错代码和DAOException继承类树的对照表,可以把JDBC Driver抛出的、Java应用代码无法直接处理的数据库出错代码字符串转化为Spring的相应类型的DAO异常,这样就可以让你针对相应的数据库异常进行相应的异常处理了。


但是这样会引发一个问题,就是Exception放到哪里处理好,假设是一个web应用,我在DAO层的实现中是否应该把异常抛出,还是在DAO层就把他处理了?
1.如果抛出异常,我在DAO层就无法rollback这个Transaction
2.如果不抛出异常,我在Servlet中就无法捕获这个异常,假设我在Servlet中想根据DAO层抛出来的不同异常,显示不同的出错页面,就不可能了

比如以下代码:

  public class PersonDAOImpl implements PersonDAO{
   
       public void updatePerson(Person p);{
             ...........................................
             try{
                       session.update(p);;
                       tx.commit();;
                  }catch(HibernateException ex);{
                          tx.rollback();;
                          ex.printStackTrace();;
                    }finally{
                            session.close();;
                      }
                  ....................................

如果异常在这个DAO类中捕获,我就可以rollback他,并且最后关闭Session.
但是我在Servlet中无法知道,catch住这个Exception.
但是如果像下面这样:
 public void updatePerson(Person p);{
             ...........................................
             try{
                       session.update(p);;
                       tx.commit();;
                  }catch(HibernateException ex);{
                         throw new MyException("HibernateEx");;
                    }

public class TestServlet extends HttpServlet{
           public void doPost(.......................);..............{
                 try{
                           pdao=PersonDAO.update(person);;
                  }catch(MyException e);{
                          response.sendRedirect("error.jsp");;
                    }

我可以根据错误自定义的Exception 来处理抛出的异常,但是由谁来rollback他和关闭Session?
0 请登录后投票
   发表时间:2005-03-11  
lyo 写道

1.如果抛出异常,我在DAO层就无法rollback这个Transaction


Spring的template method + AOP会帮你rollback

DAO是不需要写任何的事务相关, 资源管理相关的代码
0 请登录后投票
   发表时间:2005-03-11  
你还是自己去看看Spring的源代码吧,Spring进行异常转化,难道他就不rollback吗?谁告诉你它不rollback的?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics