【问题标题】:throwing meaningful exceptions from hibernate DAO implementation从休眠 DAO 实现中抛出有意义的异常
【发布时间】:2011-07-21 08:00:20
【问题描述】:

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

我想在发生错误时向用户提供有意义的消息,而不是 error500 消息。 由于基类方法使用 hibernate.Session 类的 get()、saveOrUpdate() 方法,它们会抛出 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());
           }
        }

     }

【问题讨论】:

  • 我认为最好在方法签名中抛出异常,这样就不需要重新抛出异常,您将限制try catch中方法的使用。

标签: java hibernate dao


【解决方案1】:

您确定客户想要传达有意义的信息吗?我相信有意义的错误应该出现在业务错误的情况下。对于技术(读取、意外)错误,客户应该只看到通用错误页面,可能带有错误参考代码,但仅此而已。

您的代码的另一个问题是您要将 e.getMessage 包含到错误消息中。这不好,因为该消息可能包含一些技术信息,这可能有助于侵入您的系统。但是,话虽如此,日志必须包含尽可能多的关于错误的信息(在合理的范围内,不应有密码、卡详细信息)。

因此,基本规则 - 尽可能少地向客户展示技术错误。业务错误是另一回事,在这里您应该尽可能清楚。

【讨论】:

  • 感谢您的回复..目前大多数与 db 相关的错误都会导致 error500 消息。所以,我想我会稍微改变一下..想要投票但声誉不佳
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多