Я пытаюсь реализовать оптимистическую блокировку документов в существующей базе данных MongoDB.В настоящее время нет поля version
, и я хотел бы избежать его добавления, потому что нам придется остановить приложение.
Но есть поле даты lastModified
, и кажется, что я могу использоватьэто так:
@LastModifiedDate
@Version
private Date lastModified;
Но когда я пометил это поле как @Version
и попытался сохранить элемент, я получил следующее исключение:
Не найден конвертер, способныйпреобразование из типа [java.lang.Date] в тип [java.lang.Number]
Итак, я также добавил преобразователи даты в число и длинные в дату для моей конфигурации:
@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]
Если я затем добавлю конвертер целых чисел в дату, то новый документ будет сохранен в БД, но все даты теперь NumberLong
вместо ISODate
, т. Е. Было "lastModified" : ISODate("2018-10-02T07:30:12.005Z")
, а теперь "lastModified" : NumberLong("1538465479364")
,Это нарушает согласованность между существующими документами и новыми.
Таким образом, вопросы:
- Есть ли возможность использовать
java.util.Date
с @Version
чтобы все даты сохранялись как ISODate
в MongoDB? - Может ли кто-нибудь указать на документацию по оптимистической блокировке в данных Spring для MongoDB, кроме: https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.optimistic-locking?