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
异常?