Java 我是否需要用try-catch封装所有saveOrUpdate方法?

Java 我是否需要用try-catch封装所有saveOrUpdate方法?,java,try-catch,spring-transactions,hibernate-session,Java,Try Catch,Spring Transactions,Hibernate Session,我是否总是需要将会话上的保存或更新或删除与下面的try-catch块一起放入DAOs中 public void save(Inventory object) { try { factory.getCurrentSession().saveOrUpdate(object); } catch (Exception e) { _logger.error("Cannot save or update object " + object, e); }

我是否总是需要将
会话
上的
保存或更新
删除
与下面的try-catch块一起放入DAOs中

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

通常,这取决于您是否希望在DAO中处理特定的异常。但请注意,在您的特定示例中,会话可能不会被刷新,因此您不会得到任何有趣的异常(如约束冲突)。所以我想说,捕捉它们比让它们繁殖更有意义。但是没有固定的规则。

通常这取决于您是否希望在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();
 }

您可以找到有关hibernate的更多信息和更一般的信息。

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

您可以找到有关hibernate的更多信息和更一般的信息。

您可以使用几种模式

最简单的方法是只声明
抛出异常
,但是抛出
异常
是一个非常糟糕的设计选择-它的级别太高了。事实上,villan是Hibernate——它的方法应该声明为抛出比
异常
更窄的异常

更好的方法是:

  • 定义“域异常”,例如
    MyDatabaseException
  • 声明您的抛出方法
  • 捕获然后重新抛出包装在域异常中的异常
  • 像这样:

    public void save(Inventory object) throws MyDatabaseException {
        try {
            factory.getCurrentSession().saveOrUpdate(object);
        } catch (Exception e) {
            throw new MyDatabaseException(e);
        }
    }
    
    第二种方法是一种常用的模式


    p.S.如果你将此与@Seth的“最终尝试捕捉”的好主意结合起来,你会得到一个更好的方法。

    有几种模式可以使用

    最简单的方法是只声明
    抛出异常
    ,但是抛出
    异常
    是一个非常糟糕的设计选择-它的级别太高了。事实上,villan是Hibernate——它的方法应该声明为抛出比
    异常
    更窄的异常

    更好的方法是:

  • 定义“域异常”,例如
    MyDatabaseException
  • 声明您的抛出方法
  • 捕获然后重新抛出包装在域异常中的异常
  • 像这样:

    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的好主意结合起来,您将得到一个更好的方法。

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

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

    正如Alex所说。您需要确保会话已提交或回滚,并且通常在某个位置也已关闭。哪里取决于你想要什么,就像亚历克斯说的。您需要确保会话已提交或回滚,并且通常在某个位置也已关闭。哪里取决于你想要什么。我使用Spring 3,我想
    处理提交和回滚,不是吗?我使用Spring 3,我想
    处理提交和回滚,不是吗?谢谢!我应该在哪里处理
    MyDatabaseException
    异常?谢谢!我应该在哪里处理
    MyDatabaseException
    异常?