Не удалось скопировать файл obj \ Debug \ build.force в obj \ Release \ Package \ PackageTmp \ obj \ Debug \ build.force. Не удалось найти файл 'obj \ Debug \ build.force'

К сожалению, (по крайней мере, для 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();
        }
    }

    //.....
}
0
задан James Z 16 January 2019 в 14:26
поделиться