在Spring声明性事务管理中处理Hibernate异常

在Spring声明性事务管理中处理Hibernate异常,hibernate,spring,transactions,staleobjectstate,Hibernate,Spring,Transactions,Staleobjectstate,我已经为我的Spring+Hibernate+Struts应用程序使用了必要的声明性事务管理方法。 我可以在进行服务调用的地方(事务开始的地方)捕获StaleObjectException(预期的)。在执行更新的服务方法中有嵌套调用Foo1、Foo2、Foo3。我想捕捉这些方法中的异常。我怎样才能做到?有其他选择或解决方法吗?您不应该捕获此异常。从: 如果会话引发异常,包括任何SQLException, 立即回滚数据库事务,调用Session.close() 并放弃会话实例。某些会议方法不适用

我已经为我的Spring+Hibernate+Struts应用程序使用了必要的声明性事务管理方法。
我可以在进行服务调用的地方(事务开始的地方)捕获
StaleObjectException
(预期的)。在执行更新的服务方法中有嵌套调用Foo1、Foo2、Foo3。我想捕捉这些方法中的异常。我怎样才能做到?有其他选择或解决方法吗?

您不应该捕获此异常。从:

如果会话引发异常,包括任何SQLException, 立即回滚数据库事务,调用Session.close() 并放弃会话实例。某些会议方法不适用 使会话保持一致状态。没有引发异常 Hibernate可以被视为可恢复的

这意味着,除了捕获异常以将其转换或包装为另一种异常之外,捕获异常对您没有任何帮助:在之后使用会话也不会像预期的那样工作


有关讨论乐观锁定异常处理的另一个问题,请参阅。

您不应该捕获此异常。从:

如果会话引发异常,包括任何SQLException, 立即回滚数据库事务,调用Session.close() 并放弃会话实例。某些会议方法不适用 使会话保持一致状态。没有引发异常 Hibernate可以被视为可恢复的

这意味着,除了捕获异常以将其转换或包装为另一种异常之外,捕获异常对您没有任何帮助:在之后使用会话也不会像预期的那样工作


有关讨论乐观锁定异常处理的另一个问题,请参阅。

好吧,我同意你的看法。但我想重试事务的一部分。你认为那不是个好主意吗?我应该重复整个过程吗?[这可能会对用户看到的性能造成影响]你不能。如果您想重试(在大多数情况下,这是一个坏主意,特别是当它是一个涉及最终用户的用例时),您必须回滚事务并重新启动一个新的事务,使用一个新的Hibernate会话。我是否可以包装它/截取并包装它,以便至少能够将自定义异常返回给调用方(struts action类)你当然可以。在Hibernate抛出这样的异常之后,尝试继续会话是一个非常糟糕的想法。确保交易被回滚。有没有推荐的方法?我同意你的看法。但我想重试事务的一部分。你认为那不是个好主意吗?我应该重复整个过程吗?[这可能会对用户看到的性能造成影响]你不能。如果您想重试(在大多数情况下,这是一个坏主意,特别是当它是一个涉及最终用户的用例时),您必须回滚事务并重新启动一个新的事务,使用一个新的Hibernate会话。我是否可以包装它/截取并包装它,以便至少能够将自定义异常返回给调用方(struts action类)你当然可以。在Hibernate抛出这样的异常之后,尝试继续会话是一个非常糟糕的想法。确保事务回滚。是否有推荐的方法?