我是否始终需要将saveOrUpdate
或delete
封装在Session
的DAO中,并使用try-catch block,如下所示?
public void save(Inventory object) {
try {
factory.getCurrentSession().saveOrUpdate(object);
} catch (Exception e) {
_logger.error("Cannot save or update object " + object, e);
}
}
答案 0 :(得分:2)
通常,这取决于您是否要在DAO中处理特定异常。但请注意,在您的特定示例中,会话可能不会被刷新,因此您无论如何都不会获得任何有趣的异常(例如约束违规)。所以我认为抓住它们比让它们传播更没意义。但是没有坚定的规则。
答案 1 :(得分:1)
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();
}
答案 2 :(得分:0)
您可以使用几种模式。
最简单的方法就是声明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);
}
}
第二种方法是常用的模式。
P.S。如果你将这个与@ Seth对try-catch-finally的好主意结合起来,你会得到一个更好的方法。
答案 3 :(得分:0)
我们的设计是让处理的业务逻辑代码执行try和catch异常,因为它会知道是否需要重试以及下一步该做什么。 DAO类将捕获所有异常并抛出业务逻辑代码,从而只关注数据库crud部分。因此,DAO课程将来永远可以重复使用。