在Spring框架中使用hibernate模板进行异常处理

时间:2012-03-31 10:48:49

标签: spring hibernate exception-handling

我在我的项目中使用Spring和Hibernate。在DAO实现java文件中编写了很多方法,并且每个方法都使用相同的try / catch / finally代码行,这对我来说似乎是多余的。
我被告知优化/重构代码,因为文件LOC超过10k。我读到使用 HibernateDaoSupport 的地方,我们不必担心异常或关闭会话。它将由Spring本身照顾 有人可以帮助我如何继续或做必要或更好的方法来处理异常?我粘贴在DAO层中的一个方法的代码下面。

public class 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;  

                }  
            }  
        }  
    }  


}  

1 个答案:

答案 0 :(得分:0)

处理异常的最佳方法是我相信通过编写一个Exception Interceptor来拦截你所有的DAO调用,你可以捕获你在应用程序中只需要的那些并用你自己的自定义应用程序特定异常包装它。

一旦抛出异常,您绝对不需要直接使用会话。这会破坏使用HibernateDaoSupport和Spring的目的。

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

希望有所帮助。