我是否需要使用try-catch包含所有saveOrUpdate方法?

时间:2011-06-22 01:15:39

标签: java try-catch spring-transactions hibernate-session

我是否始终需要将saveOrUpdatedelete封装在Session的DAO中,并使用try-catch block,如下所示?

public void save(Inventory object) {
    try {
        factory.getCurrentSession().saveOrUpdate(object);
    } catch (Exception e) {
        _logger.error("Cannot save or update object " + object, e);
    }
}

4 个答案:

答案 0 :(得分:2)

通常,这取决于您是否要在DAO中处理特定异常。但请注意,在您的特定示例中,会话可能不会被刷新,因此您无论如何都不会获得任何有趣的异常(例如约束违规)。所以我认为抓住它们比让它们传播更没意义。但是没有坚定的规则。

答案 1 :(得分:1)

org.hibernate.Session.saveOrUpdate抛出HibernateException,所以是的,抓住异常可能是个好主意。但是如果可以的话,我建议你在try / catch块中执行整个事务,以便在失败时将其回滚。这是一个常见的习惯用法:

 Session sess = factory.openSession();
 Transaction tx;
 try {
     tx = sess.beginTransaction();
     //do some work
     //(your call to saveOrUpdate() would go in here somewhere)
     ...
     tx.commit();
 }
 catch (Exception e) {
     if (tx!=null) tx.rollback();
     throw e;
 }
 finally {
     sess.close();
 }

您可以找到更多信息here以及更多关于休眠here的信息。

答案 2 :(得分:0)

您可以使用几种模式。

最简单的方法就是声明throws Exception,但抛出Exception是一个非常糟糕的设计选择 - 它太高级了。事实上,该别墅是Hibernate - 它的方法应该被宣告为抛出比Exception更窄的东西。

更好的方法是:

  1. 定义“域例外”,例如MyDatabaseException
  2. 声明你的方法抛出那个
  3. catch然后重新抛出包含在域异常中的异常
  4. 像这样:

    public void save(Inventory object) throws MyDatabaseException {
        try {
            factory.getCurrentSession().saveOrUpdate(object);
        } catch (Exception e) {
            throw new MyDatabaseException(e);
        }
    }
    

    第二种方法是常用的模式。

    P.S。如果你将这个与@ Seth对try-catch-finally的好主意结合起来,你会得到一个更好的方法。

答案 3 :(得分:0)

我们的设计是让处理的业务逻辑代码执行try和catch异常,因为它会知道是否需要重试以及下一步该做什么。 DAO类将捕获所有异常并抛出业务逻辑代码,从而只关注数据库crud部分。因此,DAO课程将来永远可以重复使用。