К сожалению, (по крайней мере, для Hibernate) изменение поля @Version
вручную не сделает его еще одной «версией». То есть оптимизированная проверка параллелизма выполняется против значения версии, полученной при чтении объекта, а не в поле версии объекта при его обновлении.
, например.
Это будет работать
Foo foo = fooRepo.findOne(id); // assume version is 2 here
foo.setSomeField(....);
// Assume at this point of time someone else change the record in DB,
// and incrementing version in DB to 3
fooRepo.flush(); // forcing an update, then Optimistic Concurrency exception will be thrown
Однако это не сработает
Foo foo = fooRepo.findOne(id); // assume version is 2 here
foo.setSomeField(....);
foo.setVersion(1);
fooRepo.flush(); // forcing an update, no optimistic concurrency exception
// Coz Hibernate is "smart" enough to use the original 2 for comparison
. Есть способ обхода этого. Самый простой способ - это, вероятно, реализовать оптимистичную проверку параллельности самостоятельно. Раньше у меня была утилита для сбора данных «DTO to Model», и я поставил туда эту логику проверки версий. Другой способ - поместить логику в setVersion()
, которая вместо реальной установки выполняет проверку версии:
class User {
private int version = 0;
//.....
public void setVersion(int version) {
if (this.version != version) {
throw new YourOwnOptimisticConcurrencyException();
}
}
//.....
}
Вы просто удаляете всю эту папку (obj \ Debug) из решения (не удаляйте ее из каталога) и пытаетесь опубликовать ее, безусловно, будет работать.