具有java.util.Date字段的MongoDB文档的Spring乐观锁

时间:2018-10-02 07:52:40

标签: java spring mongodb spring-data optimistic-locking

我正在尝试对现有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转换器添加,则新文档将保存在数据库中,但是所有日期现在都是NumberLong而不是ISODate,即"lastModified" : ISODate("2018-10-02T07:30:12.005Z")和现在"lastModified" : NumberLong("1538465479364")。这破坏了现有文档与新文档之间的一致性。

所以问题是:

  1. 是否可以将java.util.Date@Version一起使用,以便所有日期都以ISODate的形式存储在MongoDB中?
  2. 除了https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.optimistic-locking之外,还有人可以指向有关Spring Data for MongoDB中的乐观锁定的文档吗?

1 个答案:

答案 0 :(得分:0)

似乎当前无法将Date用作版本字段,因为它将日期强制转换为MongoTemplate中的Number。 我通过使用自定义MongoTemplate解决了该问题,该自定义MongoTemplate扩展了Spring Data MongoTemplate并覆盖了必需的方法。不幸的是,由于重写逻辑在私有方法中,因此我不得不复制粘贴很多代码。