微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 我是否总是需要使用try-catch块将DAO中的
saveOrUpdate
delete
围在
Session
上?
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
则是一个非常糟糕的设计选择-太高级了。实际上,恶棍是休眠的-它的方法应该声明为抛出比
Exception
更窄的东西。 更好的方法是: 定义一个“域例外”,例如
MyDatabaseException
声明您的方法以抛出该方法 捕获然后重新引发包装在您的域异常中的异常 像这样:
public void save(Inventory object) throws MyDatabaseException {
    try {
        factory.getCurrentSession().saveOrUpdate(object);
    } catch (Exception e) {
        throw new MyDatabaseException(e);
    }
}
第二种方法是常用的模式。 附言如果将此与@Seth的try-catch-finally的好主意相结合,您将获得更好的方法。     ,        我们的设计是让处理事务的业务逻辑代码执行try和catch异常,因为它会知道是否需要重试以及下一步该怎么做。 DAO类将捕获所有异常并抛出业务逻辑代码,从而仅专注于数据库关键部分。因此,DAO类将来将始终可重用。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。