由@Version注释的int引起的OptimisticLockException不递增

时间:2013-10-30 20:39:49

标签: java sql playframework-2.1 ebean

当我做了以下修改时,我开始从我以前工作的Play应用程序中抛出一个OptimisticLockException:

  • 我在实体中添加了一个新字段hasStarted:

    @Entity
    public class ExperimentInstance extends Model {
      @Version
      public int version;          
      @Id
      public Long id;
      public boolean hasStarted;
      ...
    

    在数据库中定义:

    alter table experiment_instances add column has_started bit default 0;
    
  • 我更新了TimerTask中的新字段,如下所示:

    final ExperimentInstance runningInstance = ExperimentInstance.findById(experimentInstanceId);
    new Timer().schedule(new TimerTask() {
      @Override
      public void run() {
        if (runningInstance != null) {
          runningInstance.hasStarted = true;
          runningInstance.save();
        }
      }
    }, lifetimeInMs);
    

我为我的数据库启用了事务日志,并查看以下两个sql语句:

update experiment_instances set has_started=true, version=3 where id=3721 and version=2

以后很久:

update experiment_instances set status='FINISHED', version=3 where id=3721 and version=2 

很明显,问题是@Version带注释的字段在表更新时没有从2递增到3;但是,我不知道从哪里开始调试这个问题。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我通过向包含类的私有范围中的辅助类添加“hasStarted()”方法解决了这个问题,如下所示:

public class HelperClass {
  private ExperimentInstance experimentInstance;

  public HelperClass(ExperimentInstance experimentInstance) {
    this.experimentInstance = experimentInstance;
  }

  public void hasStarted() {
    experimentInstance.hasStarted = Boolean.TRUE;
    experimentInstance.update();
  }
}

public class ContainingClass extends UntypedActor {
  ...
  private HelperClass helperClass = new HelperClass(experimentInstance);
  ...
  new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
      helperClass.hasStarted();
    }
  }, lifetimeInMs);
  ...

我认为问题是由“最终”关键字引起的。