2012-03-31 43 views
0

我在我的项目中使用Spring与Hibernate。在DAO实现java文件中编写了很多方法,每种方法都使用相同的try/catch/finally代码行,我。
由于文件LOC超过10k,我被告知优化/重构代码。我在某处使用HibernateDaoSupport我们不需要担心异常或关闭会话。它将由Spring本身照顾。
有人可以帮助我如何继续或做需要或任何更好的方式来处理异常?我在DAO层中粘贴一个方法的代码。在Spring框架中使用hibernate模板的异常处理

公共类CSDDaoImpl扩展的HibernateDaoSupport实现CSDDao {

public Deal getDealStructure(long dealId) throws CSDServiceException { 
     Session session = null; 
     try { 
      session = getSession(); 
      Deal deal = (Deal) session.createCriteria(Deal.class).add( 
        Restrictions.eq("dealId", dealId)).uniqueResult(); 
      return deal; 
     } catch (DataAccessResourceFailureException darfex) { 
      String message = "Failed to retrieve the deal object."; 
      CSDServiceException ex = new CSDServiceException(message, darfex); 
      ex.setStackTrace(darfex.getStackTrace()); 
      ex.setErrorCode(Constants.DATA_ACCESS_FAILURE_EXP); 
      ex.setMessageToUser(message); 
      throw ex; 
     } catch (IllegalStateException isex) { 
      String message = "Failed to retrieve the deal object."; 
      CSDServiceException ex = new CSDServiceException(message, isex); 
      ex.setStackTrace(isex.getStackTrace()); 
      ex.setErrorCode(Constants.ILLEGAL_STATE_EP); 
      ex.setMessageToUser(message); 
      throw ex; 
     } catch (HibernateException hbex) { 
      String message = "Failed to retrieve the deal object."; 
      CSDServiceException ex = new CSDServiceException(message, hbex); 
      ex.setStackTrace(hbex.getStackTrace()); 
      ex.setErrorCode(Constants.HIBERNATE_EXP); 
      ex.setMessageToUser(message); 
      throw ex; 
     } finally { 
      if (session != null && session.isOpen()) { 
       try { 
        session.close(); 
       } catch (HibernateException hbex) { 
        log.error("Failed to close the Hibernate Session.", hbex); 
        hbex.printStackTrace(); 
        CSDServiceException ex = new CSDServiceException( 
          "Failed to close the Hibernate Session.", hbex); 
        ex.initCause(hbex.getCause()); 
        ex.setStackTrace(hbex.getStackTrace()); 
        throw ex; 

       } 
      } 
     } 
    } 


} 

回答

0

处理异常的最好的办法是,我相信通过编写一个异常拦截器拦截所有DAO调用,您可以看看,你只需要在那些你应用程序并使用您自己的自定义应用程序特定例外进行包装

一旦引发异常,您绝对不需要直接使用会话。这会挫败使用HibernateDaoSupport和Spring的目的。

看一看这个链接:http://static.springsource.org/spring/docs/current/spring-framework-reference/html/classic-spring.html

希望有所帮助。