【问题标题】:Do I need to enclose all saveOrUpdate methods with try-catch?我是否需要用 try-catch 封装所有 saveOrUpdate 方法?
【发布时间】:2011-06-22 01:15:38
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 正如亚历克斯所说。您需要确保会话已提交或回滚,并且通常也在某处关闭。在哪里取决于你想要什么。
    【解决方案2】:

    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

    【讨论】:

    • 我使用的是 Spring 3,我猜 <tx:advice> 处理提交和回滚,不是吗?
    【解决方案3】:

    您可以使用几种模式。

    最简单的方法是只声明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);
        }
    }
    

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

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

    【讨论】:

    • 谢谢!我应该在哪里处理MyDatabaseException 异常?
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 2011-05-06
      相关资源
      最近更新 更多