0

我是否总是需要使用如下所示的 try-catch 块将saveOrUpdatedelete放在DAO 中?Session

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

4 回答 4

2

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

于 2011-06-22T01:25:04.453 回答
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();
 }

您可以在此处找到更多信息,也可以在此处找到有关休眠的更多信息。

于 2011-06-22T01:27:22.557 回答
0

您可以使用几种模式。

最简单的就是声明throws Exception,但是抛出Exception是一个非常糟糕的设计选择——它太高级了。事实上,小人是 Hibernate——它的方法应该被声明为抛出比Exception.

更好的方法是:

  1. 定义一个“域例外”,例如MyDatabaseException
  2. 声明你的方法来抛出它
  3. catch 然后重新抛出包含在您的域异常中的异常

像这样:

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

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

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

于 2011-06-22T01:28:50.950 回答
0

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

于 2011-06-22T01:38:11.957 回答