ObjectOptimisticLockingFailureException не генерируется при ручном изменении версии на предыдущую. - PullRequest
0 голосов
/ 14 января 2020

Я определил объект, где @version используется для отслеживания версии транзакций.

public abstract class AbstractTrackableEntity extends AbstractSimpleEntity implements TrackableEntity<Long> {

    private static final long serialVersionUID = 1998861325669866459L;

    public static final long INITIAL_VERSION = 1L;

    @Embedded
    private HistoryTracking historyTracking;

    @Version
    @Column(name = "versioncnt", precision = 12, nullable = false)
    private long version = INITIAL_VERSION;

    @Override
    public HistoryTracking getHistoryTracking() {
        return historyTracking;
    }

    public void setHistoryTracking(HistoryTracking historyTracking) {
        this.historyTracking = historyTracking;
    }

    @Override
    public long getVersion() {
        return version;
    }

    public void setVersion(long version) {
        this.version = version;
    }

}

Тест, написанный для генерации исключения, упомянут ниже:

  @Transactional
    @Test(expected = ObjectOptimisticLockingFailureException.class)
    public void shouldThrowExceptionWhenSaveEntityWithOldVersion() {
        T entity = getNewEntity();
        getJpaRepository().saveAndFlush(entity); // generate version 1
        entity.getHistoryTracking().setUpdateDateTime(LocalDateTime.now());
        entity = getJpaRepository().saveAndFlush(entity); // generate version 2
        entity.setVersion(1L);
        getJpaRepository().saveAndFlush(entity); // should throw exception but it is not
    }

Последнее saveAndFlu sh должно вызвать исключение ObjectOptimisticLockingFailureException, но оно выдает ошибку подтверждения и сохраняет версию как 3. она не переопределяет версию.

...