使用java.util.Date字段的MongoDB文档的Spring乐观锁

问题描述 投票:0回答:1

我正在尝试为现有MongoDB数据库中的文档实现乐观锁定。目前没有version字段,我想避免添加它,因为我们必须停止应用程序。

但是有一个lastModified日期字段,似乎我可以像这样使用它:

@LastModifiedDate
@Version
private Date lastModified;

但是当我将此字段标记为@Version并尝试保存项目时,我得到以下异常:

没有找到能够从类型[java.lang.Date]转换为类型[java.lang.Number]的转换器

所以,我还在我的配置中添加了Date to Number和Long to Date转换器:

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {

    ...

    @Override
    public CustomConversions customConversions() {
        return new CustomConversions(CustomConversions.StoreConversions.NONE,
            Arrays.asList(
                new DateToNumberConverter(),
                new LongToDateConverter()
        ));
    }
}

这就像现有文档的魅力一样。但是当我尝试添加新文档时,我得到:

没有找到能够从类型[java.lang.Integer]转换为类型[java.util.Date]的转换器

如果我然后添加一个Integer to Date转换器,那么新文档将保存在DB中,但所有日期现在都是NumberLong而不是ISODate,即"lastModified" : ISODate("2018-10-02T07:30:12.005Z")和现在的"lastModified" : NumberLong("1538465479364")。这打破了现有文档与新文档之间的一致性。

所以问题是:

  1. 是否有可能将java.util.Date@Version一起使用,以便所有日期都存储为MongoDB中的ISODate
  2. 除了这个之外,有人能指出关于MongoDB Spring Data中乐观锁定的文档:https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.optimistic-locking
java spring mongodb spring-data optimistic-locking
1个回答
0
投票

似乎目前没有可能使用Date作为版本字段,因为它被转换为MongoTemplate中的Number。我通过使用扩展Spring Data MongoTemplate并覆盖所需方法的自定义MongoTemplate解决了这个问题。不幸的是,我不得不复制粘贴很多代码,因为覆盖逻辑是私有方法。

© www.soinside.com 2019 - 2024. All rights reserved.