【问题标题】:Update Object with optimistic locking without incrementing the version使用乐观锁定更新对象而不增加版本
【发布时间】:2016-05-30 07:03:03
【问题描述】:

我们有一个使用 JPA 和 Eclipselink 的 Java EE 应用程序。我们对所有实体使用乐观锁定。 我们的一个主要实体有一个“lastConnected”属性,每次我们收到来自客户端的请求时都会更新该属性。异步可能会有其他任何属性的其他更新,因此有时这会导致 OptimisticLockException。

是否有可能在不增加实体的版本字段的情况下更新“lastConnected”属性?我真的不在乎我的“大”更新是否会覆盖“lastConnected”更改,所以不希望这个小更新导致 OptimisticLockException。

当然可以将“lastConnected”属性移动到它自己的实体中,但我不太喜欢这种解决方案。

【问题讨论】:

  • AFAIK,您不能使用 自动 锁。锁(乐观或悲观)是行明智的,您要求进行字段差异。
  • 嗯,它并不是真正的字段锁——它更像是“在发生冲突时丢弃低优先级事务”

标签: java jpa eclipselink


【解决方案1】:

除非我误解你可以将@Version 添加到lastConnected。

@Version
private Date lastConnected;

或者更好的方法是添加拦截器

public class MyInterceptor extends EmptyInterceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
            String[] propertyNames, Type[] types) {
// here you have the current state and previous state so you can add logic here
            return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types);
        }
    }

添加 jpa 属性

<prop key="hibernate.ejb.interceptor">com.greg.MyInterceptor</prop>

【讨论】:

  • 不幸的是,不是每次更新都更新 lastConnected,所以这行不通
猜你喜欢
  • 2011-08-18
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2010-09-12
  • 2020-11-26
相关资源
最近更新 更多