Я пытаюсь реализовать оптимистичную блокировку для документов в существующей базе данных MongoDB. В настоящее время поля version нет, и я бы не хотел его добавлять, потому что нам придется остановить приложение.
Но есть поле даты lastModified, и, кажется, я могу использовать его вот так:
@LastModifiedDate
@Version
private Date lastModified;
Но когда я пометил это поле как @Version и попытался сохранить элемент, я получил следующее исключение:
No converter found capable of converting from type [java.lang.Date] to type [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()
));
}
}
Это прекрасно работает с существующими документами. Но когда я пытаюсь добавить новый документ, я получаю:
No converter found capable of converting from type [java.lang.Integer] to type [java.util.Date]
Если я затем добавлю преобразователь целого числа в дату, то новый документ будет сохранен в базе данных, но все даты теперь будут NumberLong вместо ISODate, то есть были "lastModified" : ISODate("2018-10-02T07:30:12.005Z"), а теперь "lastModified" : NumberLong("1538465479364"). Это нарушает согласованность между существующими документами и новыми.
Итак, вопросы:
java.util.Date с @Version, чтобы все даты хранились как ISODate в MongoDB?



Похоже, что в настоящее время нет возможности использовать Date в качестве поля версии, потому что оно приводится к Number внутри MongoTemplate. Я решил проблему, используя свой собственный MongoTemplate, который расширяет Spring Data MongoTemplate и переопределяет необходимые методы. К сожалению, мне пришлось скопировать и вставить много кода, потому что логика переопределения находится в частных методах.