@Version列无法与Spring Data jdbc一起使用

时间:2019-03-22 15:46:02

标签: spring-data-jdbc

我的版本列定义如下

@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}}

}

1 个答案:

答案 0 :(得分:1)

当前,您必须手动增加版本,并且没有乐观锁定,即版本仅用于检查实体是否为新实体。

有一个开放的issue for support of optimistic locking,甚至还有a PR open for it。 因此,此功能很有可能在即将到来的1.1里程碑中可用。