从hibernate DAO实现中抛出有意义的异常

时间:2011-07-21 08:00:21

标签: java hibernate dao

在我的web应用程序(jsp + hibernate + hsqldb on tomcat)代码中,我使用了几个Dao实现。基类Dao实现包含所有会话打开,关闭逻辑。一些特定于域的Dao类扩展了这个基础class提供特定的find(),delete()方法

我想在发生错误时向用户提供有意义的消息,而不是error500消息。 因为,基类方法对get(),saveOrUpdate()方法使用了hibernate.Session类,所以它们会抛出HibernateException。域特定的子类需要捕获它,将它包装在一些自定义异常中并重新抛出它。

我试过这种方式..我不知道这是否是正确的做法..我会欢迎你的意见/建议

此致

吉姆

abstract class BaseDao{
   private Class persistentClass;
   public BaseDao(Class persistentClass) {
        super();
        this.persistentClass = persistentClass;
    }
   public Object findById(Long id) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Object object = null;
        try {
            object = (Object) session.get(persistentClass, id);
            return object;
        }
        finally {
            session.close();
        }
    }

    @Override
    public void saveOrUpdate(Object obj) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Transaction tx = null;
        try {
        tx = session.beginTransaction();
        session.saveOrUpdate(obj);          
        tx.commit();
        }catch(HibernateException e){
            if (tx != null) {
                       tx.rollback();   

             }
             throw e;
        }finally {
            session.close();
        }

    }
}

特定于域的dao是

class SaleOrderDao extends BaseDao{
    public SaleOrderDao() {
        super(SaleOrder.class);
    }
    @Override
   public SaleOrder findSaleOrderById(Long saleOrderId){            
            SaleOrder so =  (SaleOrder)findById(saleOrderId);
            return  so;

    }
    @Override
    public void saveOrUpdateSaleOrder(SaleOrder so){
         try{
                saveOrUpdate( so);
          }catch(HibernateException e){
              String msg = "could not insert/update saleorder"+so.getSONumber();
               throw new SaleOrderDaoException(msg+"/ "+e.getMessgae());
           }
        }

     }

1 个答案:

答案 0 :(得分:2)

您确定客户想要有意义的消息吗?我认为,只有在出现业务错误时才会出现有意义的错误。对于技术(读取,意外)错误,客户应该只看到通用错误页面,可能包含错误参考代码,但不会更多。

您的代码的另一个问题是您将e.getMessage包含在错误消息中。这样做并不好,因为潜在地,该消息可能包含一些技术信息,这可能有助于侵入您的系统。但是,据说,日志必须尽可能多地提供有关错误的信息(在合理范围内,不应该有密码,卡片详细信息)。

因此,基本规则 - 技术错误会尽可能地向客户展示。商业错误是另一个故事,在这里你应该尽可能清楚。