繁体   English   中英

我是否需要将所有saveOrUpdate方法包含在try-catch中?

[英]Do I need to enclose all saveOrUpdate methods with try-catch?

我是否总是需要使用try-catch块在以下的DAO中将saveOrUpdateSession上的delete括起来,如下所示?

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

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

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();
 }

您可以在这里找到更多信息, 在这里可以找到更多有关休眠的信息

您可以使用几种模式。

最简单的是刚刚宣布throws Exception ,而是抛出Exception是一个非常贫穷的设计选择-这是太高级别。 实际上,恶棍是Hibernate-应该声明其方法抛出比Exception更狭窄的东西。

更好的方法是:

  1. 定义一个“域异常”,例如MyDatabaseException
  2. 声明您要抛出的方法
  3. 捕获然后重新引发包裹在您的域异常中的异常

像这样:

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

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

PS:如果将此与@Seth的try-catch-finally的好主意相结合,您将获得更好的方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM