当我做了以下修改时,我开始从我以前工作的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;但是,我不知道从哪里开始调试这个问题。
非常感谢任何帮助。
答案 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);
...
我认为问题是由“最终”关键字引起的。