【问题标题】:Handling Hibernate Exceptions in Spring Declarative Transaction Management在 Spring 声明式事务管理中处理 Hibernate 异常
【发布时间】:2011-11-04 12:57:18
【问题描述】:

我为我的 Spring+Hibernate+Struts 应用程序使用了 PROPAGATION_REQUIRED 声明式事务管理方法。 我可以在进行服务调用的地方(事务开始的地方)捕获StaleObjectException(intended)。在执行更新的服务方法中有嵌套调用 Foo1、Foo2、Foo3。我想在这些方法中捕获异常。我该怎么做?任何替代方案或解决方法?

【问题讨论】:

    标签: hibernate spring transactions staleobjectstate


    【解决方案1】:

    您不应该捕获此异常。来自Hibernate reference documentation

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

    这意味着除了捕获异常以将其转换或将其包装成另一种异常之外,捕获异常对您没有帮助:使用 session after 无论如何都不会按预期工作。

    有关讨论乐观锁定异常处理的另一个问题,请参阅How to deal with locks (JPA)?

    【讨论】:

    • 好吧,我同意你的看法。但我想重试交易的一部分。你认为这不是一个好主意吗?我应该重复整个过程吗? [这可能会影响用户看到的性能]
    • 你不能。如果你想重试(在大多数情况下这是一个坏主意,特别是如果它是一个涉及最终用户的用例),你将不得不回滚事务并使用新的 Hibernate 会话重新启动一个新事务。
    • 我可以包装它/拦截并包装它,以便我至少能够将自定义异常返回给调用者(struts 动作类)?
    • 当然可以。在 Hibernate 抛出此类异常后尝试继续会话只是一个非常糟糕的主意。确保事务回滚。
    • 有推荐的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2011-04-12
    • 2015-02-03
    相关资源
    最近更新 更多