Как использовать аннотацию 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);