Весенняя оптимистическая блокировка для документа MongoDB с полем java.util.Date - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь реализовать оптимистическую блокировку документов в существующей базе данных 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"),Это нарушает согласованность между существующими документами и новыми.

Таким образом, вопросы:

  1. Есть ли возможность использовать java.util.Date с @Versionчтобы все даты сохранялись как ISODate в MongoDB?
  2. Может ли кто-нибудь указать на документацию по оптимистической блокировке в данных Spring для MongoDB, кроме: https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.optimistic-locking?

1 Ответ

0 голосов
/ 09 марта 2019

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

...