我正在尝试为现有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")
。这打破了现有文档与新文档之间的一致性。
所以问题是:
java.util.Date
与@Version
一起使用,以便所有日期都存储为MongoDB中的ISODate
?似乎目前没有可能使用Date作为版本字段,因为它被转换为MongoTemplate中的Number。我通过使用扩展Spring Data MongoTemplate并覆盖所需方法的自定义MongoTemplate解决了这个问题。不幸的是,我不得不复制粘贴很多代码,因为覆盖逻辑是私有方法。