【问题标题】:OptimisticLock Trying update the same object againOptimisticLock 再次尝试更新同一个对象
【发布时间】:2013-08-23 15:22:20
【问题描述】:

我收到以下异常:

org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存值映射不正确):[

当我再次尝试使用表单更新对象时会发生这种情况。所以第一次它运行良好,但是当我再次尝试更新同一个对象时,我得到了那个异常。

可以在会话中刷新吗?

这是我的实体
@PersistenceContext(unitName = "JPAService", type = PersistenceContextType.EXTENDED) private EntityManager nasc;

这是我的服务: @Stateless @TransactionAttribute(TransactionAttributeType.REQUIRED) @TransactionManagement(TransactionManagementType.CONTAINER)

谢谢!

【问题讨论】:

  • 第一个休眠会话是否关闭并提交了事务?看起来两个单独的线程启动了会话,都从数据库中获取了相同的对象。当第一次更新实体时,任何第二次尝试做同样的事情都会导致过时的对象异常。

标签: hibernate transactions ejb jboss7.x optimistic-concurrency


【解决方案1】:

乐观锁定的工作方式如下:您的实体中有一个版本字段(带有@Version 注释)。您加载此实体,并且(例如)版本字段的值为 33。然后您保存该实体。 Hibernate 检查实体 (33) 中的版本值是否与表中的版本值匹配。如果不是,则抛出此异常。如果它们匹配,它会增加实体和数据库中的版本。

因此,如果您再次保存实体,但仍从仍包含旧版本值 (33) 的表单中获取值,您将收到此异常。确保使用实体的最新值(包括版本字段)刷新表单对象。

没有任何代码是不可能提供更多细节的,但这应该可以让您调试并查看错误在哪里。

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多