Как использовать аннотацию morphia @Version, когда запись не существует

У меня есть приложение, в котором может быть запущено несколько экземпляров одновременно, и я использую аннотацию morphia @Version для предотвращения перезаписи экземплярами информации друг друга в общих записях (оптимистическая блокировка). Поле _id заполняется приложением, а не генерируется MongoDB.

Оптимистическая блокировка работает как положено, кроме случаев, когда создается запись. Одно или несколько приложений могут создавать одну и ту же запись, поэтому в приведенном ниже примере два экземпляра хотят создать сущность "Модель" с идентификатором "abc" практически одновременно (это означает, что оба приложения решают создать запись до того, как любой из них записал запись в MongoDB).

В этом примере я ожидал бы, что второй вызов "save" завершится неудачно, поскольку версия имеет значение null, а запись имеет версию 1, но она успешно выполняется и оставляет версию записи на 1. Я также провел этот тест, где версия намного выше на существующей записи, например 10, и в результате версия будет отброшена до 1.

Я предполагаю, что запись "неуправляема" Morphia, когда я не читаю ее из MongoDB, поэтому она просто напрямую применяет то, что я пишу, без какой-либо проверки, но я не могу прочитать запись, которая еще не существует, чтобы убедиться, что что Морфия знает об этом.

Любая помощь очень ценится!

Вот пример модели:

@Entity
public class Model
{

    @Id
    private String id;
    @Version
    private Long version;
    private String value;

    public String getId() { return id; }
    public void setId(String id)
    {
        this.id = id;
    }

    public String getValue() { return value; }
    public void setValue(String value)
    {
        this.id = value;
    }

}

Вот пример, который иллюстрирует проблему:

    // create morphia instance
    Morphia morphia = new Morphia();

    // create the Datastore connecting to the default port on the local host
    Datastore datastore = morphia.createDatastore(new MongoClient(), "testing");

    // create first model
    Model model0 = new Model();

    // update the model
    model0.setId("abc");
    model0.setValue("test");

    // save the model to MongoDB
    datastore.save(model0);

    // at this point, the record in the db has a version equal to Number(1)

    // create a new model
    Model model1 = new Model();

    // populate the model and use the same id
    model1.setId("abc");
    model1.setValue("a new value");

    // at this point model1 has a null value for the version and 
    // the database record has a version equal to Number(1)

    // save the record which should throw an error because the version 
    // is out of date
    datastore.save(model1);

0 ответов

Другие вопросы по тегам