我的版本列定义如下
@org.springframework.data.annotation.Version
protected long version;
使用Spring Data JDBC时,它总是试图插入。更新没有发生。调试时,我看到PersistentEntityIsNewStrategy
正在使用,这是默认策略。它具有isNew()
方法来确定要保留的实体的状态。我确实看到版本和ID用于此确定。
但是我的问题是,谁负责在每次保存后增加版本列,以便在第二次调用.save()
时,isNew()
方法可以返回false。
我们是否应该触发BeforeSaveEvent
并处理“版本”列的增量?这样足以应付OptimisticLock
吗?
修改 我添加了一个ApplicationListener来像这样监听BeforeSaveEvent。
public ApplicationListener<BeforeSaveEvent> incrementingVersion() {
return event -> {
Object entity = event.getEntity();
if (BaseDataModel.class.isAssignableFrom(entity.getClass())) {
BaseDataModel baseDataModel = (BaseDataModel) entity;
Long version = baseDataModel.getVersion();
if (version == null) {
baseDataModel.setVersion(0L);
} else {
baseDataModel.setVersion(version + 1L);
}
}
};
}
因此,版本列现在可以使用,但是未设置其他可审核字段@CreatedAt, @CreatedBy,@LastModifiedDate and @LastModifiedBy
!
Edit2
创建了一个新的ApplicationListener,如下所示。在这种情况下,我的自定义侦听器和Spring的RelationalAuditingListener均被调用。但是它仍然不能解决问题。因为版本号已经增加,所以侦听器的顺序(后跟弹簧的自定义)使markAudited
而不是markUpdated
调用markCreated
而不是LOWEST_PRECEDENCE
。我试图使我的监听器成为public class CustomRelationalAuditingEventListener
implements ApplicationListener<BeforeSaveEvent>, Ordered {
@Override
public void onApplicationEvent(BeforeSaveEvent event) {
Object entity = event.getEntity();
// handler.markAudited(entity);
if (BaseDataModel.class.isAssignableFrom(entity.getClass())) {
BaseDataModel baseDataModel = (BaseDataModel) entity;
if (baseDataModel.getVersion() == null) {
baseDataModel.setVersion(0L);
} else {
baseDataModel.setVersion(baseDataModel.getVersion() + 1L);
}
}
}
@Override
public int getOrder() {
return LOWEST_PRECEDENCE;
}
仍然没有运气。
我的自定义监听器在这里
{{1}}
}
答案 0 :(得分:1)
当前,您必须手动增加版本,并且没有乐观锁定,即版本仅用于检查实体是否为新实体。
有一个开放的issue for support of optimistic locking,甚至还有a PR open for it。 因此,此功能很有可能在即将到来的1.1里程碑中可用。