[英]Do I need to enclose all saveOrUpdate methods with try-catch?
我是否总是需要使用try-catch块在以下的DAO中将saveOrUpdate
或Session
上的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
更狭窄的东西。
更好的方法是:
MyDatabaseException
像这样:
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.