论坛首页 Java版 Spring

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

浏览 6513 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2005-03-10
[code:1] try {
            return session.get(entityClass, id);
        }
        catch (HibernateException ex) {
            throw SessionFactoryUtils.convertHibernateAccessException(ex);
        }
[/code:1]

其中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层抛出来的不同异常,显示不同的出错页面,就不可能了

比如以下代码:
[code:1]

  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();
                      }
                  ....................................
[/code:1]
如果异常在这个DAO类中捕获,我就可以rollback他,并且最后关闭Session.
但是我在Servlet中无法知道,catch住这个Exception.
但是如果像下面这样:
[code:1]
public void updatePerson(Person p){
             ...........................................
             try{
                       session.update(p);
                       tx.commit();
                  }catch(HibernateException ex){
                         throw new MyException("HibernateEx");
                    }[/code:1]
[code:1]
public class TestServlet extends HttpServlet{
           public void doPost(.......................)..............{
                 try{
                           pdao=PersonDAO.update(person);
                  }catch(MyException e){
                          response.sendRedirect("error.jsp");
                    }
[/code:1]
我可以根据错误自定义的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版 Spring

跳转论坛:
JavaEye推荐