锁定老帖子 主题:spring最佳实践中的这一段代码
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-03-10
try { return session.get(entityClass, id);; } catch (HibernateException ex); { throw SessionFactoryUtils.convertHibernateAccessException(ex);; } 其中catch到的Exception,为什么还要转换一下,这样作比直接 ex.printStackTrace() 好在哪里? 都是抛出异常嘛 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-03-10
ex.printStackTrace() 只是在控制台打印出异常,并没有向上抛出异常,如果只有这句的话,调用者是不知道有异常发生的。
转换的目的是将HibernateException (checked Exception)转换成DataAccessException(UnChecked Exception)。 Rod认为数据库异常对调用者都是不可恢复的。UnChecked Exception更合适。 |
|
返回顶楼 | |
发表时间:2005-03-10
还有一个目的把不同的持久化异常统一起来,比如Hibernate和JDBC的异常统一为一个更加有意义的异常体系。
|
|
返回顶楼 | |
发表时间:2005-03-10
Spring的事务管理机制要求对runtime-exception进行回滚处理,所以进行异常转换,保证事务的有效性。
|
|
返回顶楼 | |
发表时间:2005-03-10
楼上1+2+3就是正确答案啊
|
|
返回顶楼 | |
发表时间: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 的? |
|
返回顶楼 | |
发表时间: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异常,这样就可以让你针对相应的数据库异常进行相应的异常处理了。 |
|
返回顶楼 | |
发表时间: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? |
|
返回顶楼 | |
发表时间:2005-03-11
lyo 写道 1.如果抛出异常,我在DAO层就无法rollback这个Transaction Spring的template method + AOP会帮你rollback DAO是不需要写任何的事务相关, 资源管理相关的代码 |
|
返回顶楼 | |
发表时间:2005-03-11
你还是自己去看看Spring的源代码吧,Spring进行异常转化,难道他就不rollback吗?谁告诉你它不rollback的?
|
|
返回顶楼 | |